加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – VarArgs A * vs Seq [A]参数的功能

发布时间:2020-12-16 18:14:40 所属栏目:安全 来源:网络整理
导读:我正在使用 Scala 2.11.如果我创建一个像这样的函数: def func1 (a: Int* ) : Int = a.reduce(_+_) 我叫它用 func1(1,2,3,4)// 10func1(Seq(1,4) : _*)//10 这很好. 但是当我尝试定义一个函数文字时: val func2:(Int*) = Int = _.reduce(_+_) 我收到一个错
我正在使用 Scala 2.11.如果我创建一个像这样的函数:

def func1 (a: Int* ) : Int = a.reduce(_+_)

我叫它用

func1(1,2,3,4)
// 10
func1(Seq(1,4) : _*)
//10

这很好.

但是当我尝试定义一个函数文字时:

val func2:(Int*) => Int = _.reduce(_+_)

我收到一个错误说:

<console>:5: error: type mismatch;
 found   : Int* => Int
 required: Seq[Int] => Int
  lazy val $result = INSTANCE.`func2`

为什么它在第二种情况下需要Seq [Int]但在第一种情况下却不是,但定义是相同的?

如何在第一种情况下传递varargs,以便可以通过它们调用reduce?

解决方法

Scala区分了方法和函数.你的func1是一个参数为 repeated的方法,这是一个简单的Seq.另一方面,您的func2是一个函数,在该上下文中不允许重复参数.

如果编译器需要一个函数但是给它一个方法,它会执行eta-expansion.例如,方法def(s:String)= s被转换为函数(s:String)=>秒.我这样说是为了说明方法和功能之间的区别是非常明确和非常重要的.

请注意,我提供的链接显示“函数声明和定义”,这是一种笨拙的命名,因为它实际上是在谈论方法,而不是函数.函数是一个与任何其他值一样的值,它可以是例如保存在一个集合中或从另一个函数返回.方法不能.

最后一个评论,我已经完成了:不要犯一个常见错误,并认为“def是方法,val是函数”.函数也可以使用def而不是val来定义,在这种情况下,它仍然是一个函数值,但它在使用时而不是声明点进行评估.区分方法和函数的最佳方法是检查参数:def foo(someParameter:X):Y是一种方法.函数不能包含“(someParameter:X)”部分.相反,函数只是一个值,其类型是X => Y:

// method
def foo(x: X): Y = // some code that returns Y

// function
def foo: X => Y = (x: X) => // some code that returns Y

我故意使用def来表示功能(以防止读者犯下val-def错误),但使用val定义函数更常见.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读