写在前面的:
这次咱们要鼓捣鼓捣的是Primitive,直译是原始人,原始的事物,我意译一下就是原生类。那么什么是原生类呢?这意味着你无须创建一个对象(或者说只存在一个实例,对于用户定义的原生类来说),你就可以调用它的方法(类似于静态类)。它就像一个盒子,你不必打个标签(创建对象),以彰显你对它的所有权。你直接就可以用里面的东西(方法)。
来自官网的解释:
A primitive is similar to a class, but there are two critical differences:
- A primitive has no fields.
- There is only one instance of a user-defined primitive.
好,废话不多说,开始吧!
Primitive:
用primitive声明一个原生类,这里要注意一下哦!原生类中没有字段/属性,只可以有方法。例:
primitive Math
fun add(a: U64, b: 64): U64 =>
a + b
fun multiply(a: U64, b: U64): U64 =>
a * b
在这个例子中,我们定义了一个原生类——Math,其中定义了两个方法:add方法和multiply方法,分别是求两数的和与积。那我们应该如何使用原生类吗?难道我们要创建对象吗?
actor Main
new create(env: Env) =>
env.out.print(Math.add(20,9))
瞧,这就是调用原生类方法的方式,这里将输出20与9之和。这样的原生类,我称之为盒子原生类,你若想要其中的功能,只需调用它,是不是很方便:-)
原生类还有一个功能,就是作为记号。
primitive Cat
actor Main
new create(env: Env) =>
let kitten = Cat
if kitten is Cat then
env.out.print("Meow!")
end
这里我们又定义了一个原生类,但没有定义方法。这个原生类的作用是一个记号,用于标识变量或常量的值。
运用记号,我们可以做更复杂的判断:
primitive Cat
primitive Duck
type Animal is (Cat | Duck)
actor Main
new create(env: Env) =>
let animal:Animal = Cat
if animal is Duck then
env.out.print("嘎")
elseif animal is Cat then
env.out.print("喵")
end
瞧,我们定义了一个“枚举”类型,这和C语言中的枚举不同,这个枚举的意思是Animal类型的量可以是Cat类型或Duck类型。怎么样?巧妙吧!
内建原生类(内置类型):
primitive关键字也被用于定义一些内建类型,如:
Bool; ISize, ILong, I8, I16, I32, I64, I128; USize, ULong, U8, U16, U32, U64, U128; F32, F64.
原生类的构造方法和析构方法:
原生类可以有两个不同的方法,_init和_final。_init在任意actor之前被调用。_final在任意actor之后被调用。这两个函数没有参数。_init和_final方法以各自不同的原生类顺序而运行。
写在后面的:
原生类和类有一点点不同,不能拥有字段/属性;原生类可以作为标记使用;原生类还可以做枚举类型(枚举类型不一定只是原生类)。就这三点,大家记住就可以了。你也可以看看官网关于Primitive的教程:https://tutorial.ponylang.org/types/primitives.html
今天就到这里,我们下次见!欢迎加入Pony语言QQ群261824044!