首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Scala的下划线和星号魔法

理解Scala的下划线和星号魔法
EN

Stack Overflow用户
提问于 2017-02-03 22:07:04
回答 2查看 8.9K关注 0票数 9

我正在阅读和练习Scala,我找到了这个博客

阅读关于组成谓词的部分,我看到这段代码

代码语言:javascript
复制
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每个定义来说。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-03 22:23:52

SomeExpression*的意思是“0或多个元素的序列”。

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

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

any的参数是一个数组,所以传入的值必须转换为数组,这是由_*完成的。

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

票数 11
EN

Stack Overflow用户

发布于 2017-02-03 22:30:28

代码语言:javascript
复制
def any[A](predicates: (A => Boolean)*)

产生与

代码语言:javascript
复制
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编写,

代码语言:javascript
复制
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))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42033768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档