在Chapel变量声明中把类型放在哪里?
更具体地说,var a = 42: int;
和var a: int = 42;
之间有什么区别?
这个问题的三个基本背景事实:
-
Chapel的变量声明语法为:varident:type=init;
-
Chapel支持编译时类型推断
-
在教堂,
:
扮演两个角色:- 在声明新符号时用作类型说明符或约束
- 应用于表达式时作为强制转换运算符
鉴于此,声明:
var a: int = 42;
说";声明一个名为a
的变量,其类型为int
,其初始值为42;然而,
var a = 42: int;
说";声明一个名为a
的变量,该变量的类型(由于未指定(将从其初始值设定项推断出来,该初始值设定值是转换为int
的值42">
现在,在Chapel中,默认情况下42
被解释为int
,所以这个最终声明实际上与没有什么不同
var a = 42;
上述三项声明具有相同的净效果。
当你混合不同的类型时,事情会变得稍微有趣一些。例如:
var b: int(8) = 42;
表示CCD_ 10应该是初始值为42的8位整数。在Chapel中,尽管42的推断类型是int
(这是一个64位的int(,但由于它是一个可以用少于8位表示的文字值,编译器会自动将其向下转换为int(8(。
或者,下变频可以使用以下形式显式:
var b = 42: int(8); // downcast to int(8) and infer the type
但考虑一下:
var c: int(8) = a;
这将是一个错误,因为a
是默认的int变量(64位(,并且Chapel不支持从较宽int表示的变量到较窄int表示的隐式下转换。因此,在这种情况下,您需要将此声明写成两种形式之一:
var c = a: int(8); // explicitly downcast and infer the type
var c: int(8) = a: int(8); // give an explicit type and also explicitly downcast to make the initializer compatible
不用说,由于第二种形式有点迂腐,我们倾向于选择两者中的前者。