你把类型放在 Chapel 变量声明的什么地方?
Where do you put the type in Chapel variable declarations?
你把类型放在 Chapel 变量声明的什么地方?
更具体地说,var a = 42: int;
和var a: int = 42;
有什么区别?
这个问题的三个基本背景事实:
Chapel 的变量声明语法是:var ident: type = 初始化;
Chapel 支持 compile-time 类型推断
在礼拜堂,:
有两个角色:
- 作为声明新符号时的类型说明符或约束
- 应用于表达式时作为转换运算符
鉴于此,声明:
var a: int = 42;
表示“声明一个名为 a
的变量,其类型为 int
,其初始值为 42。”然而,
var a = 42: int;
表示“声明一个名为 a
的变量,其类型(因为未指定)将从其初始值设定项中推断出来,即值 42 转换为 int
。”
现在,在 Chapel 中,42
默认被解释为 int
,所以这个最终声明实际上与:
没有什么不同
var a = 42;
以上所有三个声明具有相同的净效果。
当你混合不同的类型时,事情会变得稍微有趣一些。例如:
var b: int(8) = 42;
表示 b
应该是一个初始值为 42 的 8 位整数。在 Chapel 中,即使 42 的推断类型是 int
(这是一个 64 位整数) ,因为它是一个可以用少于 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
不用说,由于第二种形式有点迂腐,我们倾向于选择前者。
你把类型放在 Chapel 变量声明的什么地方?
更具体地说,var a = 42: int;
和var a: int = 42;
有什么区别?
这个问题的三个基本背景事实:
Chapel 的变量声明语法是:var ident: type = 初始化;
Chapel 支持 compile-time 类型推断
在礼拜堂,
:
有两个角色:- 作为声明新符号时的类型说明符或约束
- 应用于表达式时作为转换运算符
鉴于此,声明:
var a: int = 42;
表示“声明一个名为 a
的变量,其类型为 int
,其初始值为 42。”然而,
var a = 42: int;
表示“声明一个名为 a
的变量,其类型(因为未指定)将从其初始值设定项中推断出来,即值 42 转换为 int
。”
现在,在 Chapel 中,42
默认被解释为 int
,所以这个最终声明实际上与:
var a = 42;
以上所有三个声明具有相同的净效果。
当你混合不同的类型时,事情会变得稍微有趣一些。例如:
var b: int(8) = 42;
表示 b
应该是一个初始值为 42 的 8 位整数。在 Chapel 中,即使 42 的推断类型是 int
(这是一个 64 位整数) ,因为它是一个可以用少于 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
不用说,由于第二种形式有点迂腐,我们倾向于选择前者。