【问题标题】:apply() function in Scala giving a compile error?Scala中的apply()函数给出编译错误?
【发布时间】:2015-10-04 19:51:52
【问题描述】:

嘿,我有以下代码:

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

【问题讨论】:

  • 有趣的问题,因为Array#apply docs 状态:Indices start at 0; xs.apply(0) is the first element of array xs. Note the indexing syntax xs(i) is a shorthand for xs.apply(i).
  • 你正在做的事情被去糖化到update,而不是applyupdate 的文档类似:​​Indices start at 0; xs.update(i, x) replaces the ith element in the array. Note the syntax xs(i) = x is a shorthand for xs.update(i, x).

标签: arrays scala compilation


【解决方案1】:

这个电话:

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);

【讨论】:

  • 你怎么能显示脱糖 - 仅通过查看bytecode
  • @KevinMeredith 请查看我的更新。它是关于 scala 代码而不是字节码 - 我们不必深入了解它是如何翻译的
【解决方案2】:

Scala Language Specification - Section 6.15 彻底涵盖了这一点:

= 运算符左侧带有函数应用程序的赋值f(args) = e 被解释为f.update(args, e),即调用由f 定义的update 函数。

换句话说,编译器将可变数组z上的赋值语法从

z(i) = "Name"z.update(i, "Name")

z.apply(3) = "Roger" 不受此特定规则的约束,因此它不起作用。


规范中的赋值语法包括:

assignment      expansion

x.f = e         x.f_=(e)
x.f() = e       x.f.update(e)
x.f(i) = e      x.f.update(i, e)
x.f(i, j) = e   x.f.update(i, j, e)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多