需要帮助理解scala代码片段吗
可能重复:需要帮助理解scala代码片段吗,scala,Scala,可能重复: 上面的代码段返回列表中长度等于3的字符串元素数。但是我不能理解这个代码片段,因为我很难掌握=>操作符在这个上下文中的用法。任何解释都会非常有用。这只是定义了一个方法,您也可以这样看: def isValid(s:String) = s.length ==3 list.count(isValid) 所以,当你使用count函数时,你给它一个条件,它是一个作为参数的函数 这只是定义了一个方法,您也可以这样看: def isValid(s:String) = s.length ==3
上面的代码段返回
列表中长度等于3
的字符串元素数。但是我不能理解这个代码片段,因为我很难掌握=>
操作符在这个上下文中的用法。任何解释都会非常有用。这只是定义了一个方法,您也可以这样看:
def isValid(s:String) = s.length ==3
list.count(isValid)
所以,当你使用count函数时,你给它一个条件,它是一个作为参数的函数 这只是定义了一个方法,您也可以这样看:
def isValid(s:String) = s.length ==3
list.count(isValid)
所以,当你使用count函数时,你给它一个条件,它是一个作为参数的函数 是的,Scala很难理解。我会尽力解释的,尽管我可能也不太明白
List.count
方法将返回布尔值的block
代码作为参数
块只是代码的一小部分,可以通过多种方式创建,例如将代码封装在{}
在scala文档中,这被描述为
def count (p : (A) => Boolean) : Int
因此,count
接受一个参数p
,该参数是一个块,它接受类型为a
的参数并返回一个布尔值
所以在这个例子中:
s => s.length == 3
是代码的块
。块通常遵循以下格式
[arguments] => [Code to execute]
因此在本例中,s
是块的输入,s.length==3
是应该返回布尔值的代码。您可以随意命名参数,只要它们的顺序正确
当使用迭代集合的方法时,例如count
、map
、each
等,传递的参数将是它迭代的集合中的当前项
如果你想了解更多有关它的信息,你应该查看我的Martin Odersky(scala的创建者)正在运行的Coursera课程,该课程将非常详细地介绍如下细节:是的,scala可能很难理解。我会尽力解释的,尽管我可能也不太明白
List.count
方法将返回布尔值的block
代码作为参数
块只是代码的一小部分,可以通过多种方式创建,例如将代码封装在{}
在scala文档中,这被描述为
def count (p : (A) => Boolean) : Int
因此,count
接受一个参数p
,该参数是一个块,它接受类型为a
的参数并返回一个布尔值
所以在这个例子中:
s => s.length == 3
是代码的块
。块通常遵循以下格式
[arguments] => [Code to execute]
因此在本例中,s
是块的输入,s.length==3
是应该返回布尔值的代码。您可以随意命名参数,只要它们的顺序正确
当使用迭代集合的方法时,例如count
、map
、each
等,传递的参数将是它迭代的集合中的当前项
如果你想了解更多关于它的信息,你应该查看我的Martin Odersky(scala的创建者)正在运行的Coursera课程,它将非常详细地涵盖这样的细节:(我没有看到你发布了另一个(重新措辞的)问题。这是我对你的第一个问题的回答)
除了传递值/名称之外,=>
还用于定义函数文字,这是用于定义函数的另一种语法
示例时间。假设你有一个函数,它接受了另一个函数。集合中充满了它们,但我们将选择filter
<代码>过滤器
在集合(如列表)上使用时,将删除导致您提供的函数返回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>)
我们在这里所做的是创建一个函数,该函数接受一个字符串(因为people
的类型是List[String]
),并返回一个布尔值。很酷吧
这种语法在许多上下文中使用。假设您想编写一个函数,该函数接受另一个函数。这个函数应该接收一个字符串,然后返回另一个字符串
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)
这就是函数文字的含义。返回到按名称<代码>和按值<代码>有一个技巧,您可以强制在需要时才计算参数。经典的例子是:
def logger(message: String) = {
if(loggingActivated) println(message)
}
这看起来没问题,但是调用记录器
时实际会计算消息
。如果消息
需要一段时间进行评估,该怎么办?例如,logger(veryLongProcess())
,其中veryLongProcess()
返回一个字符串。哎呀?不是真的。我们可以利用我们对函数文本的了解,强制在实际需要时才调用veryLongProcess()
def logger(message: => String) = {
if(loggingActivated) println(message)
}
logger(veryLongProcess()) // Fixed!
logger
现在接收一个不带参数的函数(因此左侧的裸=>
)。您仍然可以像以前一样使用它,但现在,消息只有在使用时(在println
中)才会进行评估。(我没有看到您发布了另一个(重新措辞的)问题。以下是我对您的第一个问题的回答)
除了传递值/名称之外,=>
还用于定义函数文字,这是用于定义函数的另一种语法
示例时间。假设你有一个函数,它接受了另一个函数。集合中充满了它们,但我们将选择filter
<代码>过滤器
在集合(如列表)上使用时,将删除导致您提供的函数返回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>)
我们在这里所做的是创建一个函数,该函数接受一个字符串(因为people
的类型是List[String]
),并返回一个布尔值。很酷吧
这种语法在许多上下文中使用。假设您想编写一个接受ano的函数