将标量分配给元组
Assignment of scalar to a tuple
对于像x : 2*real
这样的元组,它似乎支持各种元素操作,例如
var t = (1.0, 2.0); // type = (real,real) or 2*real
writeln( t ); // (1.0, 2.0)
writeln( t + 0.1 ); // (1.1, 2.1)
writeln( t * 10.0 ); // (10.0, 20.0)
writeln( t * 10.0 + 1.0 ); // (11.0, 21.0)
writeln( t ** 2 ); // (1.0, 4.0)
但是将标量赋值给元组,例如
t = 0.0; // my expected result: t = (0.0, 0.0)
报错:
error: Cannot assign to 2*real(64) from real(64)
禁止这样做是因为标量到元组的转换没有明确定义或不明确,还是可能出于其他原因?如果是这样,是否希望用户编写自定义赋值例程 ike proc =(t, x)
(以重载 =
)?
你好@voidwkr:我相信我们保守地选择在 Chapel 中将其设为非法,担心如果有人没有意识到左侧表达式是一个元组,可能会让他们大吃一惊。关于在左侧的异构元组的情况下应该做什么,也可能存在一些问题。
就是说,我还认为,鉴于 Chapel 支持的其他元组-标量组合,如您所见(更不用说数组 <-标量赋值),有理由支持此类赋值。
当对这样的问题有疑问时,我们通常会尝试采取保守的方法,因为如果我们后来决定我们错了,我们就不太可能破坏现有代码。如果您认为我们在这里做出了错误的选择,我鼓励您在 Chapel 的 GitHub 问题页面上提出功能请求,提出您的理由:https://github.com/chapel-lang/chapel/issues
正如您所指出的,支持此类分配的一种方法是提供您自己的 =
重载来处理这种情况,就像这样 (TIO):
var t = (1.0, 2.0); // type = (real,real) or 2*real
t = 0.0;
writeln(t);
proc =(ref lhs: 2*real, rhs: real) {
for l in lhs do
l = rhs;
}
对于像x : 2*real
这样的元组,它似乎支持各种元素操作,例如
var t = (1.0, 2.0); // type = (real,real) or 2*real
writeln( t ); // (1.0, 2.0)
writeln( t + 0.1 ); // (1.1, 2.1)
writeln( t * 10.0 ); // (10.0, 20.0)
writeln( t * 10.0 + 1.0 ); // (11.0, 21.0)
writeln( t ** 2 ); // (1.0, 4.0)
但是将标量赋值给元组,例如
t = 0.0; // my expected result: t = (0.0, 0.0)
报错:
error: Cannot assign to 2*real(64) from real(64)
禁止这样做是因为标量到元组的转换没有明确定义或不明确,还是可能出于其他原因?如果是这样,是否希望用户编写自定义赋值例程 ike proc =(t, x)
(以重载 =
)?
你好@voidwkr:我相信我们保守地选择在 Chapel 中将其设为非法,担心如果有人没有意识到左侧表达式是一个元组,可能会让他们大吃一惊。关于在左侧的异构元组的情况下应该做什么,也可能存在一些问题。
就是说,我还认为,鉴于 Chapel 支持的其他元组-标量组合,如您所见(更不用说数组 <-标量赋值),有理由支持此类赋值。
当对这样的问题有疑问时,我们通常会尝试采取保守的方法,因为如果我们后来决定我们错了,我们就不太可能破坏现有代码。如果您认为我们在这里做出了错误的选择,我鼓励您在 Chapel 的 GitHub 问题页面上提出功能请求,提出您的理由:https://github.com/chapel-lang/chapel/issues
正如您所指出的,支持此类分配的一种方法是提供您自己的 =
重载来处理这种情况,就像这样 (TIO):
var t = (1.0, 2.0); // type = (real,real) or 2*real
t = 0.0;
writeln(t);
proc =(ref lhs: 2*real, rhs: real) {
for l in lhs do
l = rhs;
}