嘿,我有以下代码:
var z:Array[String] = new Array[String](4);
z(0) = "Dave";
z(1) = "Joe";
z(2) = "Jim";
z.apply(3) = "Roger";
这里的最后一行是给出一个编译时错误,说“在类Array中缺少方法的参数;如果你想把它作为一个部分应用的函数处理,请用'_'跟随这个方法”
这对我来说没有意义,因为我已经读过当你将一个或多个值的括号应用于变量时,Scala会将代码转换为对该变量名为apply的方法的调用。 如果是以下行:
z(2) = "Jim";
转换为
z.apply(2) = "Jim";
那么为什么行
z.apply(3) = "Roger";
给我一个编译时错误?
我是Scala的新手,所以任何帮助都会非常感谢!
答案 0 :(得分:7)
这个电话:
z(2) = "Jim";
获取翻译为
z.update(2, "Jim")
当您尝试分配值时, apply
不起作用。
<强>更新强>
您可以自己检查。在控制台中运行:scala -print
,然后输入val ar = Array(1, 2, 3)
然后,当您键入下一行ar(2) = 5
时,它会显示生成的代码。它有点复杂(解释器为它自己的目的增加了很多东西),但你可以找到这个(或类似的)行:
$line3.iw.ar().update(2, 5);
答案 1 :(得分:2)
Scala Language Specification - Section 6.15彻底涵盖了这一点:
f(args) = e
运算符左侧带有函数应用程序的赋值=
被解释为f.update(args, e)
,即调用由{{1}定义的update
函数}}
换句话说,编译器会从
更改可变数组f
的赋值语法
z
至z(i) = "Name"
z.update(i, "Name")
不受此特定规则的约束,因此无法使用。
规范中的分配语法包括:
z.apply(3) = "Roger"