我正在阅读和练习Scala,我发现了blog。
阅读关于撰写谓词的部分我看到了这段代码
var test = result.UpdatedGpi[0];
我有一个python背景,想要了解下划线和星号的含义,当单独使用或一起使用时,理解它是很奇怪的,特别是对于 none 和每个定义。
答案 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
_