首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala "a“+ _.toString的行为不像"a".+(_.toString)

Scala "a“+ _.toString的行为不像"a".+(_.toString)
EN

Stack Overflow用户
提问于 2012-07-03 20:49:43
回答 2查看 484关注 0票数 4

据我所知,在Scala中使用中缀操作符应该等同于调用一个方法。所以:

代码语言:javascript
复制
scala> "a" + 3.toString
res0: java.lang.String = a3

与以下内容相同:

代码语言:javascript
复制
scala> "a".+(3.toString) 
res1: java.lang.String = a3

当有一个占位符时,我遇到了一个没有发生这种情况的场合。我在做一些更复杂的事情,但它可以被提炼成:

代码语言:javascript
复制
scala> def x(f:(Int)=>String) = f(3)
x: (f: Int => String)String
scala> x("a" + _.toString)
res3: String = a3

到目前一切尚好。但是..。

代码语言:javascript
复制
scala> x("a".+(_.toString))
<console>:9: error: missing parameter type for expanded function ((x$1) => x$1.toString)
          x("a".+(_.toString))

这里有什么不同?我遗漏了什么?

乔迪

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 20:56:45

在其函数中,_占位符只能出现在最上面的Expr中。这意味着

代码语言:javascript
复制
(_.toString)

本身就是一个函数,而"a" + some function of unknown type对编译器来说意义不大。

票数 11
EN

Stack Overflow用户

发布于 2012-07-03 23:15:37

您对中缀表示法的评估是正确的,但您对占位符参数的理解是有缺陷的。

当您使用下划线作为占位符参数时,您正在创建一个函数。问题是这个函数的边界是什么:它从哪里开始,从哪里结束?例如,考虑以下表达式:

代码语言:javascript
复制
_ + _ + _

它应该如何翻译?以下是一些替代方案:

代码语言:javascript
复制
(x, y, z) => { x + y + z }
(x, y) => { (z) => { x + y } + z }
(x) => { x + { (y, z) => y + z } }

好吧,Scala规则是作用域是最里面的括号分隔的表达式,否则就是整个表达式。所以,在实践中,你写了两个不同的东西:

代码语言:javascript
复制
x("a" + _.toString) // is the same thing as
x((y) => "a" + y.toString)

x("a".+(_.toString)) // is the same thing as
x("a".+((y) => y.toString))
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11311290

复制
相关文章

相似问题

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