9

我在 scala 中阅读了很多使用符号的代码片段=>,但我从来没有真正理解过它。我试图在互联网上搜索,但找不到任何全面的东西。任何关于符号如何使用/可以使用的指针/解释都将非常有帮助。

(更具体地说,我还想知道运算符是如何在函数文字中出现的)

4

1 回答 1

19

不仅仅是传递值/名称,=>还用于定义函数文字,这是用于定义函数的替代语法。

示例时间。假设您有一个接收另一个函数的函数。集合中充满了它们,但我们会挑选filterfilter,当用于集合(如列表)时,将取出导致您提供的函数返回 false 的任何元素。

val people = List("Bill Nye", "Mister Rogers", "Mohandas Karamchand Gandhi", "Jesus", "Superman", "The newspaper guy")
// Let's only grab people who have short names (less than 10 characters)
val shortNamedPeople = people.filter(<a function>)

我们可以从其他地方传入一个实际的函数(def isShortName(name: String): Boolean也许是 ),但将它放在那里会更好。唉,我们可以使用函数文字。

val shortNamedPeople = people.filter( name => name.length < 10 )

我们在这里所做的是创建一个函数,该函数接受一个字符串(因为people它是 type List[String]),并返回一个布尔值。很酷,对吧?

此语法在许多情况下使用。假设要编写一个接收另一个函数的函数。这个其他函数应该接受一个字符串,并返回一个 Int。

def myFunction(f: String => Int): Int = {
  val myString = "Hello!"
  f(myString)
}
// And let's use it. First way:
def anotherFunction(a: String): Int = {
  a.length
}
myFunction(anotherFunction)
// Second way:
myFunction((a: String) => a.length)

这就是函数字面量。回到by-nameand by-value,有一个技巧,你可以强制一个参数不被评估,直到你想要。经典例子:

def logger(message: String) = {
  if(loggingActivated) println(message)
}

这看起来没问题,但message实际上logger是在调用时评估的。如果message需要一段时间来评估怎么办?例如,logger(veryLongProcess()), whereveryLongProcess()返回一个字符串。哎呀?并不真地。我们可以利用我们对函数文字的了解来强制veryLongProcess()在实际需要之前不要调用它。

def logger(message: => String) = {
  if(loggingActivated) println(message)
}
logger(veryLongProcess()) // Fixed!

logger现在正在接受一个不带参数的函数(因此=>左侧是裸露的)。您仍然可以像以前一样使用它,但现在,仅在使用它message时才评估(在 中println)。

于 2012-09-21T12:08:22.770 回答