繁体   English   中英

斯卡拉语法糖

[英]Scala syntactic sugar

这是我的代码。 我想写表达式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个字符?

正如Alexiv指出的那样,问题是在为一元运算符使用postfix语法之后,你不能放置二元运算符。 postfix语法存在多个问题,这就是除非您启用特殊语言功能,否则Scala 2.10会向您发出警告的原因。

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

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

所以规则在这里被定义为相反的方式,即Scala似乎首先假设浮点数和整数秒。 7.? 将被解释为Double上的方法,而7.xInt上的方法,如果你想在Double ,你必须写7. x

没有怎么做相反的事情? 在期间放置一个空格

7 .? & 10 .?

...当然只要使用括号就可以了

(7?) & (10?)

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

使用-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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM