git地址
https://github.com/a18792721831/studyScala.git
1. 中缀
什么是中缀?
中缀就是形如 a + b的表达式
就是中缀表达式
中缀表达式两边是参数,中间是操作。
在编程语言中,基本类型支持所有的中缀表达式。
比如在Java中,可以写 1+2就是中缀表达。
当然,在Java中,除了基本类型,还有包装类型,得益于自动拆箱和自动装箱,包装类也可以写中缀表达式。
但是,作为普通的类就没有这样好的待遇了。
在scala中,因为在调用方法时,可以有限的省略点。
所以,scala可以实现普通类的中缀表达式。
举个例子:
class Middle(v: Int){
val add = (x: Middle) => this.v + x.getV
}
我们创建了一个普通的Java类,有一个add函数。
同时有一个int的属性。
add函数有一参数,其类型是其本身,实现的操作是将调用本身的属性值与参数的属性值进行相加,然后返回。
在Java中,我们只能如下调用
对象.方法(参数)
不过,在scala中,可以用中缀表达式进行调用。
我们写这个类的伴生对象,然后在伴生对象中写main方法进行调用。
object Middle{
def apply(x: Int) = new Middle(x)
def main(args: Array[String]): Unit = {
val xs = Middle(3)
val xsw = Middle(4)
println(xs add xsw)
println(xs.add(xsw))
println(Middle(8) add Middle(10))
println(Middle(8).add(Middle(10)))
}
}
在伴生类中,定义了apply方法,使得我们可以像调用无参方法一样得到类的对象。
然后我们可以用中缀表达式进行调用
其输出结果如下
2. 后缀
除了中缀表达式,还有后缀表达式
后缀表达式比较常见的写法形如取反等等
!true就是后缀表达式。
当然这个解释可能不太正确。
不过,在scala中后缀主要是表达一个方法调用的方式。
对于无参方法的调用,可以省略点
最终的结果就像shell命令一样。
对象 操作
举个例子
我们在1中的类中增加一个无参的方法
def getV = this.v
然后在伴生类中调用。
println(Middle(19) getV)
println(Middle(19).getV)
当然,要用后缀表达式进行调用无参方法,还需要导入一个scala实现的包
import scala.language.postfixOps
如果不导入这个包,编译会报错
Error:(19, 24) postfix operator getV needs to be enabled
by making the implicit value scala.language.postfixOps visible.
----
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scaladoc for value scala.language.postfixOps for a discussion
why the feature needs to be explicitly enabled.
println(Middle(19) getV)
其执行结果如下