了解Scala的下划线和星号魔法

时间:2017-02-03 22:07:05

标签: scala

我正在阅读和练习Scala,我发现了blog

阅读关于撰写谓词的部分我看到了这段代码

var test = result.UpdatedGpi[0];

我有一个python背景,想要了解下划线和星号的含义,当单独使用或一起使用时,理解它是很奇怪的,特别是对于 none 每个定义。

2 个答案:

答案 0 :(得分:2)

def any[A](predicates: (A => Boolean)*)

产生与

相同的功能
def any[A](predicates: Seq[A => Boolean])

除了你可以像any(a, b, c)而不是any(List(a, b, c))一样调用它(编译器会转换调用站点)。

鉴于any是一个varargs函数,调用any(a)any的正文带入predicates = List(a)。但如果a已经是一个序列,那么这不是你想要的。这就是: _*符号的用途:它告诉Scala编译器“将其视为varargs的一系列参数”。

这大致相当于用Python编写,

def complement(predicate):
    return lambda a: not predicate(a)

def any_(*predicates):
    return lambda a: any(pred(a) for pred in predicates)

def none(*predicates):
    return complement(any_(*predicates))

def every(*predicates):
    return none(*map(complement, predicates))

答案 1 :(得分:1)

SomeExpression*表示“0个或更多元素的序列”

_可用于指定“我们不需要命名的参数”

none的参数是“包含0个或更多元素的谓词序列”,“谓词”是取A并返回Boolean的函数。

any的参数是一个数组,因此传入的值必须转换为数组,由_*

完成

every的参数是一个数组,其名称并不重要,因为只有一个。它可以作为complement

传递给_