Scala从零开始:中缀表示法和后缀表示法

在Scala中有很多为了方便而创造的语法规则,使用这些语法规则可以创建更简洁的语法,使编程更加有效。今天我们来看两个常用的语法规则,即中缀表示法(infix syntax)和后缀表示法(suffix syntax)。


中缀表示法

这两个语法规则都是针对方法(method)来说的,所以在开始,我们创建两个类,然后添加方法:

package com.doggie

object Bartender {
  def main(args: Array[String]): Unit = {
	  val gin: Liquor = new Liquor("Gin")
	  val tonic: Liquor = new Liquor("Tonic")
	  val mixed = gin.mix(tonic)
	  println(mixed)
  }

}

class Liquor(name: String) {
  def mix(rho: Liquor): String = {
    this.name + " and " + rho.getName
  }
  def getName(): String = this.name
}

注1:方法最后一条表达式的值即为返回值,Scala不建议使用return来显示表达


其中Liquor类是对酒类的一个抽象,其中包含一个属性name,标识酒类的名字。getName方法可以返回实例的name,mix方法将两个类实例的name字段混合,并以String形式返回混合后的名字。

Bartender对象中的main方法负责创建两个Liquor类对象gin和tonic,然后调用gin的mix方法(使用tonic作为参数),最后打印混合后的名字。

编译运行这段代码,得到输出:

Gin and Tonic

我们注意到mix只有一个参数,对于只有一个参数的方法来说,Scala提供了中缀表示法来简化对这种方法的调用语法,我们对以上代码修改,得到:

package com.doggie

object Bartender {
  def main(args: Array[String]) = {
    println(new Liquor("Gin") mix new Liquor("Tonic"))
  }

}

class Liquor(name: String) {
  def mix(rho: Liquor): String = {
    this.name + " and " + rho.getName
  }
  def getName() = this.name
}


编译运行后,得到和修改前一样的输出。
我想你已经注意到了,在mix方法的调用操作符(.)和包围参数的小括号都可以省略掉。这就是 中缀表示法:

1.方法的参数只有1个(Arity-1)

2.调用时省略调用操作符和包围参数的括号

往深处想一想,以下这段代码等同于什么呢?

package com.doggie

object Add {
  def main(args: Array[String]) = {
    println(1 + 2)
  }
}

答案你已经猜到了:

package com.doggie

object Add {
  def main(args: Array[String]) = {
    println((1).+(2))
  }
}
注2:我们给1加上括号的原因是防止Scala的编译器将1.推断成一个double型。


后缀表达式

那么后缀表达式呢?与中缀表达式类似,后缀表达式适用于无参数的方法(Arity-0),下面是一个例子:

package com.doggie

object Waiter{
  def main(args: Array[String]) = {
    val whisky = new Liquor("Whisky")
    println(whisky.getName())
  }
}

class Liquor(name: String) {
  def getName() = this.name
}
使用后缀表达式后,代码如下:

package com.doggie

object Add {
  def main(args: Array[String]) = {
    println(new Liquor("Whisky") getName)
  }
}

class Liquor(name: String) {
  def getName() = this.name
}
注3:当一个方法的参数个数为0时,在方法声明时可以省略方法名称后的括号。如果声明时不省略括号,调用时允许以带括号或者省略括号的形式调用;如果声明时省略了括号,则调用时只允许不带括号的形式。

两段代码运行的输出完全一样:

Whisky


以上就是这两种特殊语法的用法,还等什么呢?快用到你的代码中去吧!


声明:本文为原创,禁止用于任何商业目的,转载请注明出处:http://blog.csdn.net/asongoficeandfire/article/details/21563731

你可能感兴趣的:(scala,编程语言,大数据,函数式编程,语法)