Scala-def模糊性
只是来接斯卡拉。尽管网上有很多教程,但我发现学习这门语言的基础知识非常困难。有人能解释一下下面代码的细微差别吗?(使用scala 2.10.2) 案例1Scala-def模糊性,scala,scala-2.10,Scala,Scala 2.10,只是来接斯卡拉。尽管网上有很多教程,但我发现学习这门语言的基础知识非常困难。有人能解释一下下面代码的细微差别吗?(使用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()
scala> def greet = println("helloo")
greet: Unit
scala> greet
helloo
scala> greet()
<console>:9: error: Unit does not take parameters
greet()
^
然而,令人惊讶的是,Scala语言没有明确的概念描述
抱歉,如果这是一个全新的问题 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
一切顺利。参数块是一种组织参数的方法,它向编译器发出信号,告诉编译器如何处理从方法(def是)到函数(可以作为参数传递的方法)的转换
现在,如果有空的参数块,为了简洁起见,可以省略它们:
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擅长在需要时自动将方法包装到函数中。)
所以
表示每次调用b
,都应该创建一个不带参数的函数,并返回println(“Hi”)
返回的任何内容。实际上,它返回单位
,即没有返回值——它实际上是一个值,但它始终是同一个实体:()
。这避免了返回void
的过程/方法和具有返回值的方法必须有特殊情况;每件事都有一个返回值(至少在概念上)。无论如何,如果您有一个:
val c = b
那么你可以称之为:
c() // Will print "Hi"
或者,您可以一次创建并调用所有内容
b() // The `b` part creates the function, `()` calls it.
例如,一次参观将涵盖您在这方面需要的所有基本知识。(我喜欢纸质版,即使需要付费。)谢谢你简洁明了的回答。这确实让我的概念清晰了很多。Scala拥有丰富的Java经验,其功能的深度和广度令人叹为观止!这不会让你的销售代表达到六位数,但你是否考虑过在youtube上发布一些实景教程?然后你可以说,“我在教程中详细讨论了这一点……”等等@som snytt-我更像是一个作家而不是演员。其他人可以为YouTube做改编。@vecktworking:事实上,与Java相比,Scala要简单得多。它有更少的角落案例,更少的例外,更少的任意决定,而且,是的,实际上甚至没有那么多的特性。可能更少,例如,它没有原语,没有静力学,它(几乎)没有运算符。例如,Java有嵌套类,但没有嵌套方法或嵌套包。Scala只是嵌套了所有内容。在Java中,有些东西可以是抽象的,有些东西可以是参数化的,有些东西可以两者兼而有之,有些东西两者都不能。在Scala中,一切都可以是抽象的和参数化的。Scala语言规范比Java语言规范小得多。(不可否认,它们的书写风格有些不同。)几乎-1表示“Scala语言没有清晰的概念描述”。滚动投票的定义是“不显示任何研究成果”。但很明显,你尝试了一些东西,只是没有尝试,嗯,谷歌。@som snytt我不是想成为一个聪明的傻瓜,但你应该注意到,我在我的问题中陈述了以下内容:尽管网上有很多教程。更具建设性的做法是在这个问题之前已经解决过的地方发布一个链接。我夸大了修辞效果,很抱歉惹你生气。我的观点是,尽管Scala有细微差别,但缺少文档和博客并不是它的缺点之一。和无参数def。嗯。FWIW,这仍然很棘手。
val c = b
c() // Will print "Hi"
b() // The `b` part creates the function, `()` calls it.