Home > Scala > Scala: 方法名约定

Scala: 方法名约定

Scala中没有操作符但是支持运算符重载,方法的最后一个字符也对优先级有影响,它决定了方法调用的目标。

Scala的这个约定在熟悉之后你会发现它提高了流畅性,例如,如果想要将一个值添加到一list中,可以写作:value::list,尽管可以读为:“value被附加到list上”,这个方法的目标实际上list而参数是value,也就是说list.::(value)。

如果方法名以冒号结尾,那调用目标是操作符后面的实例,在下一个例子中,^() 是一个定义在类Cow中的方法,而 ^:() 是一个定义在Moon中的方法:

class Cow {
	def ^(moon: Moon) = println("Cow jumped over the moon")
}
class Moon {
	def ^:(cow: Cow) = println("This cow jumped over the moon too")
}

调用如下:

val cow = new Cow
val moon = new Moon
cow ^ moon
cow ^: moon

这两种调用方式看起来基本是相同的,cow在左而moon在右,但前一个调用是在cow上而后一个则是在moon上,这种区别对于新手来说可能很奇怪,但它在列表操作中是很平常的,所以最好熟悉这种写法,前面代码的输出是:

Cow jumped over the moon
This cow jumped over the moon too

除了以冒号结尾的操作符外,也有一系列的操作符也是以跟随它们的实例为目标,比如一元操作符+,-,!,和~。比如 ,+映射到对unary_+()的调用,其余类同。

注意Scala不允许一个方法名以操作符结尾的同时操作符前面又是字母,除非添加一个下划线。例如jumpOver:()是不允许的,而jumpOver_:() 则可以被接受。

下面是一个在Sample类中定义一元操作的示例:

class Sample {
	def unary_+ = println("Called unary +")
	def unary_- = println("called unary -")
	def unary_! = println("called unary !")
	def unary_~ = println("called unary ~")
}
val sample = new Sample
+sample
-sample
!sample
~sample

输出如下:

Called unary +
called unary -
called unary !
called unary ~

Related posts:

  1. Scala : “运算符” 重载
  2. Scala : Option 和 foldLeft
Categories: Scala Tags:
  1. phil
    September 2nd, 2010 at 16:18 | #1

    原来是校友啊,很喜欢你的网站,你的主机空间在哪买的啊?我也想弄一个

    ReplyReply
  2. leeing
    September 3rd, 2010 at 11:00 | #2

    @phil:

    你可以看看:www.gegehost.com。

    ReplyReply
  1. No trackbacks yet.