在Scala中的apply()函数给出编译错误?

时间:2015-10-04 19:51:53

标签: arrays scala compilation

嘿,我有以下代码:

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的新手,所以任何帮助都会非常感谢!

2 个答案:

答案 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的赋值语法

zz(i) = "Name"

z.update(i, "Name")不受此特定规则的约束,因此无法使用。

规范中的分配语法包括:

z.apply(3) = "Roger"