2014-09-05 67 views
0

嗨,我正在学习Scala语言并且有一个问题。我正在读一本书,其中一个例子说0到2和(0)。到(2)是一样的。我怎样才能解释这个语法?我的意思是,我可以看到这是一个以一个整数值为参数的函数。但什么是“(0)”。部分??谢谢在scala中调用函数的语法

回答

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围绕一个括号的是,在旧版本斯卡拉0.的由于.(它既可以是小数点分隔符又可以是方法选择器)的模糊值,可能会被解释为浮点数。由于斯卡拉2.11(或2.10,我不记得了),这已得到修复,所以你现在可以安全地输入

0.+(2) // Int: 2 

,并得到一个Int回来,而你将不得不在过去Float,如编译器会看到它作为

0.0 + (2) // Float: 2 
+0

此外,整数和其他原始类型被自动转换为等效的对象类型。值“0”是一个整数,并自动转换为“Int”。 'Int'有一个方法'to()',它接受一个整数参数。 – 2014-09-05 23:21:59

+0

@Bob,这是另一种方式。 'Int'是一个对象类型,然后在底层JVM中用一个原语表示。在2.10中弃用 – 2014-09-05 23:25:54

+0

,在2.11中新的行为。差异在'val i = 0;'以前是双重的,但现在是错误。 – 2014-09-06 02:06:18

0

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

不,它不是一个函数,它是一种方法。

的方法是通过将消息发送到一个对象调用:

foo.bar(baz) 

这意味着“与由baz引用作为参数由foo引用的对象的对象发送消息bar这将反过来导致方法barfoo的类或其祖先之一要被调用。

所以,to是消息,2为参数,并0是理论值的接收器电子邮件。

斯卡拉允许你使用一个.或空白的消息发送:

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)