这是一个定义并尝试一些功能的 Scala 会话:
scala> def test1(str: String) = str + str;
test1: (str: String)java.lang.String
scala> test1("ab")
res0: java.lang.String = abab
效果很好。
scala> val test2 = test1
<console>:6: error: missing arguments for method test1 in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
val test2 = test1
^
哎呀。
scala> val test2 = test1 _
test2: (String) => java.lang.String = <function1>
scala> test2("ab")
res1: java.lang.String = abab
效果很好!
现在,我已经看到了_
折叠时的语法 (_ + _
, ETC)。据我了解_
基本上意味着“争论”。所以test1 _
基本上意味着一个带有参数的函数,它被赋予test1
”。但为什么不是这样exactly和刚才一样test1
?如果我附加一个,为什么会有差异_
?
于是我不断探索...
scala> val test3 = (str: String) => str + str
test3: (String) => java.lang.String = <function1>
scala> test3("ab")
res2: java.lang.String = abab
scala> val test4 = test3
test4: (String) => java.lang.String = <function1>
在这里它的工作原理没有_
!和有什么区别def
ed 函数,以及val
ed 函数?
The def
在周围的对象/类/特征中声明一个方法,类似于在 Java 中定义方法的方式。您只能使用def
其他对象/类/特征中的 s。在 REPL 中,您看不到周围的对象,因为它是“隐藏的”,但它确实存在。
您不能分配def
到一个值,因为def
不是一个值 - 它是对象中的一个方法。
The (x: T) => x * x
声明并实例化一个函数对象,它在运行时存在。函数对象是匿名类的实例,它扩展了FunctionN
特征。FunctionN
特质伴随着apply
方法。名字apply
是特殊的,因为它可以被省略。表达f(x)
脱糖成f.apply(x)
.
底线是 - 由于函数对象是存在于堆上的运行时值,因此您可以将它们分配给值、变量和参数,或者从方法中将它们作为返回值返回。
为了解决将方法分配给值的问题(这可能很有用),Scala 允许您使用占位符从方法创建函数对象。表达test1 _
在上面的示例中实际上创建了一个围绕该方法的包装函数test1
- 它相当于x => test1(x)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)