2

刚拿起Scala。尽管网上有很多教程,但学习该语言的基础知识却出奇地棘手。有人可以解释以下代码的细微差别吗?(使用 Scala 2.10.2)

情况1

scala> def greet = println("helloo")
greet: Unit
scala> greet
helloo
scala> greet()
<console>:9: error: Unit does not take parameters
          greet()
               ^

案例2

scala> def greet = ()=>println("helloo")
greet: () => Unit
scala> greet
res31: () => Unit = <function0>
scala> greet()
helloo

案例3

scala> def greet() = println("helloo")
greet: ()Unit
scala> greet
helloo
scala> greet()
helloo

然而,令人惊讶的是,Scala 语言没有明确的概念描述 对不起,如果这是一个完全新手的问题!

4

1 回答 1

8

Scala 可以有任意数量的参数块,而不仅仅是一个。所以:

def f(i: Int) = i + 2
def g(i: Int)(j: Int) = i + j
def h(i: Int)(j: Int)(b: Boolean) = if (b) i + j else i * j

一切正常。参数块是一种组织参数的方法,并向编译器发出信号,告诉编译器如何处理从方法(defs 是)到函数(可以作为参数传递的方法)的转换。

现在,如果你有空的参数块,你可以省略它们为简洁起见:

def a()()() = println("Hi") // Do nothing!
a()()()                     // Full call
a()                         // Drop some
a                           // Drop all of them

所有的调用都a做同样的事情。但是你不能添加比属于更多的空参数块——这些被解释为对方法返回的任何内容的调用。

a()()()()                   // No go, calls `()` on `Unit` which doesn't exist

因此,这涵盖了您的案例 1 和案例 3。

现在,您还可以让方法返回一个函数。函数将参数(只有一个块!)映射到输出,但与方法不同,您可以传递它。(Scala 擅长在需要时自动将方法包装到函数中。)

所以

def b = () => println("Hi")

说每次调用时b,都应该创建一个不带参数并返回任何println("Hi")返回值的函数。实际上,它返回Unit,即没有返回值——它实际上是一个值,但它始终是同一个实体:()。这避免了过程/方法返回void和具有返回值的方法的特殊情况;一切都有一个返回值(至少在概念上)。无论如何,如果你有一个:

val c = b

那么你可以调用它:

c()    // Will print "Hi"

或者您可以一次创建并调用所有内容

b()    // The `b` part creates the function, `()` calls it.

例如,通过Scala 编程之旅将涵盖您在这方面需要的所有基础知识。(我喜欢拥有一份纸质副本,即使必须为此付费。)

于 2013-08-01T20:37:28.077 回答