首先是 any 通用类型,这个类似于 Java 中的 Object 和 Go 中的 interface{},极大的方便了我们编写一些标准库。
以之前内置的 hash 和 len 函数为例,需要对每种类型都实现一遍,非常麻烦而且毫无必要;现在只需要定义一次即可,代码量直接省几倍。
同理,之前实现的 Map 只支持存放 string 类型,现在便能存放任何类型的数据。
对 any 的实现过程感兴趣的朋友,今后可以单独分享一下。
运算符重载
写 go 或者是 Java 的朋友应该知道,这两门语言都无法对两个对象进行运算,编译器会直接报错。
但在一些特殊场景下还是蛮好用的,于是我参考了 C# 的语法在 GScript 中也实现了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classPerson{ int age; Person(int a){ age = a; } } Person operator + (Person p1, Person p2){ Person pp = Person(p1.age+p2.age); return pp; } Person operator - (Person p1, Person p2){ Person pp = Person(p1.age-p2.age); return pp; } Person p1 = Person(10); Person p2 = Person(20); Person p3 = p1+p2; println("p3.age="+p3.age); assertEqual(p3.age, 30);
// return JSON string string JSON(any a){} // JSON query with path any JSONGet(string json, string path){}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classPerson{ int age; string name; float weight; bool man; Person(string n, int a, float w, bool m){ name = n; age = a; weight = w; man =m; } } Person p1 = Person("abc",10,99.99,true); Person p2 = Person("a",11,999.99,false); string json = JSON(p1); println(json); // output:{"age":10,"man":true,"name":"abc","weight":99.99}
以这段代码为例,调用 JSON 函数可以将对象序列化为 JSON 字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classPerson{ int age; string name; float weight; bool man; Person(string n, int a, float w, bool m){ name = n; age = a; weight = w; man =m; } } Person p1 = Person("abc",10,99.99,true); string json = JSON(p1); println(json);
int age = JSONGet(json, "age"); println(age); assertEqual(age,10);