38.scala编程思想笔记——定义操作符
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50447582
源码下载连接请见第一篇笔记。
方法名可以包含几乎所有字符。
也可以对操作符+ 赋予新的含义如下:
class Molecule {
varattached:Molecule = _
defplus(other:Molecule) =
attached =other
def+(other:Molecule) =
attached =other
}
var m1 = new Molecule
var m2 = new Molecule
m1.plus(m2)
m1.+(m2)
// Infix calls:
m1 plus m2
m1 + m2
其中Molecule对象会依附与另一个其自身类型的对象。Attached域将一个Molecule与另一个Molecule连接起来,并且必须初始化,避免Scala报错。调用了Scala的特殊空字符,即下划线的另一重含义。
普通的采用圆点表示法的方法调用,也可以通过中缀表示法来调用。
某些语言提供了操作符重载机制,即将一组挑出来的字符保留下来,并赋予特殊的解析方式和行为。
不过Scala使得所有字符都是平等的。因此,Scala没有提供操作符重载机制,而是选择了更加优雅的方式。
例如:
import language.postfixOps
class Swearing {
def #!>% ="Rowzafrazaca!"
}
val x = new Swearing
println(x.#!>%)
println(x #!>%)
输出如下:
Rowzafrazaca!
Rowzafrazaca!
这样可以创建出优雅而透明的代码。
不过即使一种语言不包含重载机制或不具备让程序员发明自己的操作符的能力,也可以良好的运转。
定义操作符时确实有可能造成其含义模糊,因此要缜密行事。