Scala的语法糖(Scala syntactic sugar)

2019-10-18 08:56发布

这里是我的代码。 我想写式7? &10? 所以它编译。

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个字符,这体现在哪里?

Answer 1:

与编译-Xfuture在您的INT使用点符号:

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


Answer 2:

作为Alexiv指出,问题是,你不能把一个二元运算符使用后后缀语法为单目运算符。 没有与后缀语法,这就是为什么斯卡拉2.10会警告你,除非你启用一种特殊的语言特征的多个问题。

所以理论上7.? & 10.? 7.? & 10.? 应该管用。 但现在你碰到整数和浮点文字之间的模糊的问题。 从斯卡拉语言规范§1.3.2“浮点字面”:

如果程序字面浮点后跟以字母开头的令牌,必须有至少一个插入所述两个标记之间的空白字符。

因此,规则被定义此相反的方向,即斯卡拉似乎假定一个浮点数第一和第二的整数。 7.? 将被解释为在一个方法Double ,而7.x是一个方法Int ,如果你想上Double ,你会写7. x

没有怎么办相反? 一段的空间

7 .? & 10 .?

......当然,这使得它只要使用圆括号

(7?) & (10?)

所以,你没有得到你的6个字符,但后来为什么需要它短?



Answer 3:

Scala编译器解释7 ? & 7 ? &这条线是一个简单的高阶方法调用: 7.?(&)导致它的一个有效的Scala代码,scalac不会找隐分辨率和扔你一个语法错误。



文章来源: Scala syntactic sugar