Dart试用手记 – 2、语法与评论

Dart的语法比较传统,可以看到Java,C++的影子

1. 注释

// 单行注释
/* … */ 注释块

2. 变量

Dart有2种变量var与final
final必需要初使化且只能赋值一次

3. 函数

Dart的函数格式:[返回类型] [函数名] 参数列表 函数体
参数列表与函数体是必需的其余可省略
而 Dart的函数体有2种形式
=> 单一表达式
{ 各种表达式 }

由此以函数都是合法的

(a, b) => a + b;
() => 'yes';
(a, b) { return a + b; };
() { return 'yes'; };
add(a, b) => a+b;
int add2(a, b) { return a+b; };

匿名函数使用的小例子

print((a, b) { return a + b; }(3, 4)); // 输出 7
print(((a, b) => a + b)(3,4)); // 输出 7

同时函数可以写成
final add = (a, b) => a + b;
但只能在函数体中使用,无法在类与全局中使用,否则会出 Error: line 1 pos 13: initializer must be a compile time constant 错误
合法

main()
{
	final add = (a, b) => a + b; //合法
	print(add(3,4));
}

不合法

class Foo
{
	final add = (a, b) => a + b; // 不合法 1
}
final add = (a, b) => a + b; // 不合法 2,1与2两者实质是一样的

main ()
{
}

4. 闭包

Dart可谓是为专门闭包而生,由以上的函数定义,可以写一个闭包的小例子

foo()
{
	var hello = 'hello';
	return () {
		return hello;
	};
}
main()
{
	print(foo()()); // 输出 hello
}

5. 类

Dart万物皆类,所以类是Dart中不可缺少的一部分
类定义

class 类名称 { [各种成员与方法] }

方法定义

[static] [返回类型] [get|set] 名称 参数列表

抽象方法

abstract [static] [返回类型] [get|set] 名称

由以上类定义写一个类的小例子

class Foo
{
	static add(a, b) => a + b;
	sub(a, b)
	{
		return a - b;
	}

	get a()
	{
		return 'a';
	}

} 

main()
{
	print(Foo.add(3, 4));         // 输出 7
	print((new Foo()).sub(4, 3)); // 输出 1
	print((new Foo()).a); // Getter a,输出 a
}

类继承,Dart只支持单继承
class 类名 extends 类名
调用父方法 super

Dart支持多个接口
interface, implements 与 factory
interface 名称 [factory 名称]
{
}

class 名称 [implements 以,分割的多个名称]
{
}

6. 数组与Hash

[ ] Array 例 [1, 2]
{} Hash 例 {‘a’: ‘b’}

7. 循环

for (名称 in 容器) {
}

for (定义; 条件; 执行) {
}

while (条件) {
}

do {
} while (条件);

main()
{
	for (var i in [1, 2]) {
		print(i);
	}
	
	for (var i=0; i<10; ++i) {
		print(i);
	}

	var i =0;
	while (i < 10) {
		print(i);
		++i;
	}

	i = 0;
	do {
		print(i);
		++i;
	} while (i < 10);

}

静观其变

==在试验中发现如下代码==

main()
{
	var st = new Date.now();
	var j = 0;
	for (var i=1; i <= 100000; ++i) 
	{
		j += i;
	}
	var ed = new Date.now();

	print(j);
	print(ed.difference(st));
}

输出

5000050000
0:00:00.288

288ms,对比ruby的73ms,V8的5ms,C的2ms可谓相当之慢,使用命令为out/Release_ia32/dart_bin hello.dart,希望是我使用上的问题。且Dart的语法略显拙劣,由此我放弃继续对Dart的学习,静观其变。

Dart评论

缺点与疑点
1、class {} 后不能接分号
理论上;号作为分隔符存在class {};理应是合法的,class行为过于诡异。

2、Dart强制分号作分割
说不上好坏,但定位显得有问题,对于部份不习惯用;结尾的js使用者来说会有不适

3、怪异的私有变量声明,前置 _
根据Dart规范中描述前置 _ 变量名意为私有,_在C里是作为系统或内部命令存在,而在Dart中成了普遍,更奇怪的除了若要声明私有除了前置_别无选择。

4、展开的’字串行为
对于目前所有流行语言,皆为”#{嵌入的语句}”或”{$foo}”等,而单引号不展开,而Dart中单引号却会展开如 ‘hello $world’

5、不尽人意的性能
Dart的纯面向对象的设定出发点是支持的,我也希望能有好的表现,但现在来看此设定大大影响了语言的性能,而且实现上似乎有问题,在数值计算中连Ruby都比不过,Dart若用于Canvas,游戏运算等,定会面对大量的数值运算,如果未来性能仍然不佳,难免沦落成为一个鸡肋的存在。

优点
更加完整的OO支持,OO虽然不是必需的,但有比没有好,但担心复杂的特性或多或少会带来性能上的损失,不清楚Dart能优化到什么程度。

同样Dart的严格,使灵活性大大不如Javascript,失去灵活性代码量必然会上升,严格与灵活,各有所长,但在追求代码简练高产的脚本领域,Dart显得有些劣势。

发表评论

电子邮件地址不会被公开。 必填项已用*标注