scala – 像=一样的字符串隐式转换列表

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

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

scala> x += x

scala> x
res2: java.lang.String = asdfasdf

解决方法

你选了一个特别糟糕的例子.在某种意义上,=是String的一部分.有关java.lang.String的Javadoc,请参阅此注释:

The Java language provides special support for the string
concatenation operator ( + ),and for conversion of other objects to
strings.

您将不得不查找Java language specification以查找有关它的更多信息(15.18.1).但是,再一次,Scala不是Java,所以也是Scala language specification(12.3.1)的一部分.

到目前为止,我已经谈过,而不是=.但是,Scala有一个特殊的语法糖用于分配.如第6.12.4节所述,除了< =,> =,!=和以=开头的运算符之外,如果以等号结尾的任何运算符符号(请参阅第1章中的“运算符字符”)将被重新解释,如果它不作为一种方法存在.特别,

x += 1

将被重新解释为

x = x + 1

无论x是否为var,都会发生这种情况,因此有时可能会看到错误消息“重新分配给val”.

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

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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...