列表字符串隐式转换,例如+=

4 浏览
0 Comments

列表字符串隐式转换,例如+=

考虑以下代码片段。+= 不是 java.lang.String 的成员函数,所以我猜测可能会发生某种隐式转换。我该如何查找在 String 上作用的这种预定义的隐式转换的列表?

scala> var x = "asdf"
x: java.lang.String = asdf
scala> x += x
scala> x
res2: java.lang.String = asdfasdf

admin 更改状态以发布 2023年5月20日
0
0 Comments

你需要在 scala.Predef 中查找 - 所有在那里定义的隐式对象都将始终处于范围之内(因此您不需要导入它们)。

如果您查看 它的源代码,您会发现这个部分:

// Strings and CharSequences ------------
...
implicit def augmentString(x: String): StringOps = new StringOps(x)
implicit def unaugmentString(x: StringOps): String = x.repr
...

0
0 Comments

你选了一个特别糟糕的例子。在某种意义上,+=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 中无法搜索 +=

0