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

vis*_*uki 3 scala implicit-conversion

请考虑以下代码段.+ =不是java.lang.String的成员,所以我猜有某种隐式转换正在进行中.如何查找作用于String的此类预定义隐式转换的列表?

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

scala> x += x

scala> x
res2: java.lang.String = asdfasdf
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 13

你选了一个特别糟糕的例子.+=从某种意义上说,是一部分String.在Javadoc上查看此评论java.lang.String:

Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串.

您必须查找Java语言规范以查找有关它的更多信息(15.18.1).但是,再一次,Scala不是Java,因此+也是Scala语言规范(12.3.1)的一部分.

到目前为止,我已经提到过+,而不是+=.但是,Scala有一个特殊的语法糖用于分配.如部分6.12.4中所述,除了<=,>=,!=并开始与运营商=,如果它不作为一种方法存在的任何运算符(见第1章"的操作符字符"),在一个等号结束将被重新解释.特别,

x += 1
Run Code Online (Sandbox Code Playgroud)

将被重新解释为

x = x + 1
Run Code Online (Sandbox Code Playgroud)

无论是否x为a 都会发生这种情况var,因此有时可能会看到错误消息" reassignment to val".

因此,正如您所看到+=String,通过Scala规范中复制的Java规范中的异常,以及一些语法糖,实际上是其中的一部分.

这并不意味着没有没有的方法java.lang.String可以通过隐式转换与它一起使用.不过,我会把它留给其他答案.如果我是你,我会改变问题中的方法,使其正确.此外,+=Stack Overflow中无法搜索.


ten*_*shi 8

你需要查看scala.Predef - 所有定义的implicits总是在范围内(所以你不需要导入它们).

如果您查看它的源代码,您将找到此部分:

// Strings and CharSequences ------------

...

implicit def augmentString(x: String): StringOps = new StringOps(x)
implicit def unaugmentString(x: StringOps): String = x.repr

...
Run Code Online (Sandbox Code Playgroud)