我正在阅读和练习Scala,我找到了这个博客。
阅读关于组成谓词的部分,我看到这段代码
def complement[A](predicate: A => Boolean) = (a: A) => !predicate(a)
def any[A](predicates: (A => Boolean)*): A => Boolean =
a => predicates.exists(pred => pred(a))
def none[A](predicates: (A => Boolean)*) = complement(any(predicates: _*))
def every[A](predicates: (A => Boolean)*) = none(predicates.view.map(complement(_)): _*)我有一个python背景,想要理解下划线和星号的含义,当单独使用或一起使用时,弄清楚它是很奇怪的,特别是对于none和每个定义来说。
发布于 2017-02-03 22:23:52
SomeExpression*的意思是“0或多个元素的序列”。
_可用于指定“我们不需要命名的参数”。
none的参数是“包含0或多个元素的谓词序列”,“谓词”是接受A并返回Boolean的函数。
any的参数是一个数组,所以传入的值必须转换为数组,这是由_*完成的。
every的参数是一个数组,它的名称并不重要,因为只有一个。它可以作为complement作为_传递给
发布于 2017-02-03 22:30:28
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)将使用predicates = List(a)进入any的主体。但是如果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))https://stackoverflow.com/questions/42033768
复制相似问题