1

这是我的代码。我想写表达式 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 个字符,但写得太不同了?

4

3 回答 3

2

正如 Alexiv 指出的那样,问题在于在对一元运算符使用后缀语法后,您无法放置二元运算符。后缀语法存在多个问题,这就是为什么 Scala 2.10 会警告您,除非您启用特殊的语言功能。

所以理论上7.? & 10.?应该有效。但是现在您遇到了整数和浮点文字之间的歧义问题。来自 Scala 语言规范 §1.3.2 “浮点文字”:

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

所以规则在这里以相反的方式定义,即 Scala 似乎首先假设一个浮点数和第二个整数。7.?将被解释为 a 上的方法Double,而7.xis 是 on 上的一个方法Int,如果您想要它 on Double,则必须编写7. x.

没有反着怎么办?在句号之前放置一个空格

7 .? & 10 .?

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

(7?) & (10?)

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

于 2013-07-08T13:58:39.587 回答
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
于 2013-07-08T23:22:54.607 回答
0

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

于 2013-07-08T13:31:50.260 回答