在scala中调用函数的语法

时间:2014-09-05 23:07:00

标签: scala

您好我正在研究scala语言并且有一个问题。我正在读一本书,其中一个例子说0到2与(0)。到(2)相同。我该如何解释这种语法?我的意思是,我可以看到to是一个函数,它接受一个整数值作为参数。但是什么是"(0)。"部分??感谢

2 个答案:

答案 0 :(得分:5)

在scala中,任何采用单个参数的方法都可以使用中缀语法编写。

所以,例如,如果你有

class Foo(x: Int) {
   def add(y: Int) = x + y
}
val a = new Foo(42)

然后这两个方法调用完全等效

a.add(4) // 46
a add 4  // 46

0周围有一个括号的原因是,在较早版本的scala中,0.会被解释为浮点数,因为.的值不明确(可以是小数分隔符和方法选择器)。由于scala 2.11(或2.10,我不记得了),这已经修复,所以你现在可以安全地输入

0.+(2) // Int: 2

然后得到一个Int,而过去你会得到一个Float,因为编译器会把它视为

0.0 + (2) // Float: 2

答案 1 :(得分:0)

  

我的意思是,我可以看到to是一个以一个整数值作为参数的函数。

不,这不是一个功能,它是一种方法。

通过向对象发送消息来调用方法:

foo.bar(baz)

这意味着“使用bar引用的对象作为baz引用的对象的参数发送消息foo。这将导致方法bar进入foo的类或其中一个祖先被调用。

因此,to是消息,2是参数,0是消息的接收者。

Scala允许您使用.或空格来发送消息:

foo bar(baz)
// is the same as
foo.bar(baz)

此外,当使用空格进行消息发送时,如果只有一个参数,则可以不使用最后一个参数列表的括号:

foo bar baz
// is the same as
foo bar(baz)

最后,括号不仅用于参数列表,它们还用于分组。 (还有元组文字。)你总是可以用括号括起表达式来阐明它的优先级:

(foo).bar(baz)
// is the same as
foo.bar(baz)