首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala语法糖

Scala语法糖
EN

Stack Overflow用户
提问于 2013-07-08 20:59:28
回答 3查看 675关注 0票数 1

这是我的代码。我想写下表达式7?& 10?这样它就可以编译。

代码语言:javascript
复制
object Test {
  trait A {
    def &(other: A) = ???
  }
  case class B(i: Int) extends A
  implicit class C(i: Int) {
    def ? : A= B(i)
  }
  val u = 7?
  val v = 10?
  val w = u & v // Ok, it compiles
  val z = 7? & 10?   //';' expected but 10 found
  val g = 7.? & 10?  //';' expected but 10 found
  val h = (7?) & 10? //Type mismatch. found Int(10). Required Test.A
  val i = 7? & (10?) //Test.A does not take parameters (on the ?)
}

为什么我不能写7?& 10?有没有可能通过以不同的方式写这个表达式,用6个字符来写它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-09 07:22:55

-Xfuture编译,以便在整数上使用点符号:

代码语言:javascript
复制
apm@mara:~/tmp$ scala -Xfuture 
Welcome to Scala version 2.10.1 (OpenJDK 64-Bit Server VM, Java 1.7.0_21).
[your stuff here]

scala> 7.? & 10.?
scala.NotImplementedError: an implementation is missing
票数 1
EN

Stack Overflow用户

发布于 2013-07-08 21:58:40

正如Alexiv所指出的,问题是在使用postfix syntax作为一元运算符之后,不能放置二元运算符。postfix语法存在多个问题,这就是为什么Scala2.10会向您发出警告,除非您启用特殊的语言特性。

因此,从理论上讲,7.? & 10.?应该可以工作。但是现在你遇到了整型和浮点型文字之间的歧义问题。摘自Scala语言规范§1.3.2“浮点文字”:

如果程序中的浮点文字后面跟着以字母开头的标记,则这两个标记之间必须至少有一个中间的空格字符。

因此,规则在这里的定义是相反的,即Scala似乎首先假设浮点数,其次是整数。7.?将被解释为Double上的方法,而7.xInt上的方法,如果您希望在Double上这样做,则必须编写7. x

否如何反其道而行之?在 period之前放置一个空格

代码语言:javascript
复制
7 .? & 10 .?

..。当然,这使得它与使用括号一样长

代码语言:javascript
复制
(7?) & (10?)

所以你没有得到你的6个字符,但是为什么需要这么短呢?

票数 2
EN

Stack Overflow用户

发布于 2013-07-08 21:31:50

Scala编译器将7 ? &这一行解释为一个简单的高阶方法调用:7.?(&),因为它是一个有效的scala代码,scalac不会寻找隐式解析并抛出语法错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17527302

复制
相关文章

相似问题

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