列表字符串隐式转换,例如+=
列表字符串隐式转换,例如+=
考虑以下代码片段。+= 不是 java.lang.String 的成员函数,所以我猜测可能会发生某种隐式转换。我该如何查找在 String 上作用的这种预定义的隐式转换的列表?
scala> var x = "asdf" x: java.lang.String = asdf scala> x += x scala> x res2: java.lang.String = asdfasdf
你需要在 scala.Predef 中查找 - 所有在那里定义的隐式对象都将始终处于范围之内(因此您不需要导入它们)。
如果您查看 它的源代码,您会发现这个部分:
// Strings and CharSequences ------------ ... implicit def augmentString(x: String): StringOps = new StringOps(x) implicit def unaugmentString(x: StringOps): String = x.repr ...
你选了一个特别糟糕的例子。在某种意义上,+=
是 String
的组成部分。看一下 java.lang.String
的 Javadoc 上的这个评论:
Java 语言提供了特殊的支持字符串连接运算符 (
+
) 和其他对象转换为字符串。
你必须查找 Java 语言规范 以获取更多信息 (15.18.1)。但是,Scala 并不是 Java,所以 +
也是 Scala 语言规范 的一部分 (12.3.1)。
到目前为止,我已经谈到了 +
,而不是 +=
。但是,Scala 有一个专门的语法糖来解析赋值。如第 6.12.4 节所述,除去以 =
开头的 <=
、>=
、!=
和运算符之外,任何以等号结尾的运算符符号 (请参阅第 1 章中的 "运算符字符") 如果不存在为方法,则会被重新解释。具体来说,
x += 1
将被重新解释为
x = x + 1
这会发生无论 x
是否为 var
,因此有时会看到错误消息 "reassignment to val
"。
因此,如你所见,+=
实际上是 String
的一部分,通过在 Java 规范中复制的 Scala 规范中的异常,再加上一些语法糖。
这并不意味着没有不在 java.lang.String
中的方法可以通过隐式转换与之一起使用。然而,我会把这留给其他回答。如果我是你,我会更改问题中的方法,使其正确。此外,在 Stack Overflow 中无法搜索 +=
。