我在scala中阅读了很多使用符号的代码片段=>,但我从来没有真正理解它.我试图在互联网上搜索,但找不到任何全面的东西.关于如何/可以使用符号的任何指针/解释都将非常有用.
(更具体地说,我也想知道运算符如何在函数文字中出现)
And*_*ner 16
除了传递值/名称之外,=>还用于定义函数文字,函数文字是用于定义函数的替代语法.
示例时间.假设你有一个函数接受另一个函数.收藏品充满了他们,但我们会选择filter.filter,当在集合(如List)上使用时,将取出导致您提供的函数返回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>)
Run Code Online (Sandbox Code Playgroud)
我们可以从其他地方传递一个实际的函数(def isShortName(name: String): Boolean也许),但是将它放在那里会更好.唉,我们可以用函数文字.
val shortNamedPeople = people.filter( name => name.length < 10 )
Run Code Online (Sandbox Code Playgroud)
我们在这里做的是创建一个接受String(因为people是类型List[String])的函数,并返回一个布尔值.很酷,对吗?
此语法在许多上下文中使用.假设你想编写一个接受另一个函数的函数.这个其他函数应该接受一个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)
Run Code Online (Sandbox Code Playgroud)
这就是函数文字的含义.回到by-name和by-value,有一个技巧,你可以强制参数不被评估,直到你想要.经典的例子:
def logger(message: String) = {
if(loggingActivated) println(message)
}
Run Code Online (Sandbox Code Playgroud)
这看起来没问题,但message实际上是在logger被调用时进行评估.如果message需要一段时间来评估怎么办?例如,logger(veryLongProcess())where veryLongProcess()返回一个String.哎呦?并不是的.我们可以使用我们关于函数文字的知识来强制veryLongProcess()在实际需要之前不要调用它们.
def logger(message: => String) = {
if(loggingActivated) println(message)
}
logger(veryLongProcess()) // Fixed!
Run Code Online (Sandbox Code Playgroud)
logger现在正在接受一个不带参数的功能(因此=>在左侧裸体).您仍然可以像以前一样使用它,但现在,message仅在使用它时(在println)中进行评估.
| 归档时间: |
|
| 查看次数: |
2543 次 |
| 最近记录: |