Scala是构建在JVM上的静态类型的脚本语言,而脚本语言总是会有些约定来增强灵活性。关于协议在Python中是挺多的,看看Python的对象协议,有很多很多,如果对Python的对象协议了解(不了解的可以点击此处)的比较深刻的话,其实Scala的应用方法也是很好理解的,比如说Scala为配合DSL在方法调用时有这么一条约定:
,,,, <强>在明确了方法调用的接收者的情况下,若方法只有一个参数时,调用的时候就可以省略点及括号。如“0到2”,实际完整调用是“0.(2)”。但“println(2)”不能写成“println 10””,因为未写出方法调用的接收者控制台,所以可以写成“控制台println 10”强>
<强>
强>
到这里就要讲到应用和更新方法相关的约定,描述的是直接在对象(对象)后直接加圆括号的代码的情况下,那就是:
<强>用括号传递给变量(对象)一个或多个参数时,Scala会把它转换成对应用方法的调用;与此相似的,当对带有括号并包括一到若干参数的进行赋值时,编译器将使用对象的更新方法对括号里的参数和等号右边的对象执行调用。强>
<强>
强>
我感觉这一点有点像Python里的可调用对象协议,即定义类的__call__方法,也可以得到类似的功能。
当然,两者语言语法上肯定有差异,但是我觉得这块儿它们的设计思想应该是异曲同工。下面通过几个例子来理解。
1。比如数值theArray,取数组的第一个元素的操作theArray(0)会转换成theArray.apply(0)操作,这也能解释为什么Scala数组取值不用中括号括下标的方式,因为它也是<强>一次方法调用强>
2。anyObject (“key1”)会被转换成anyObject.apply(“关键”)操作,比如地图的取值操作,举个简单的例子:
,,
class SomeClass { ,,,def 应用(关键:字符串):,String =, { ,,,,,,,println (“apply method ,, key ,:,“, +,键) ,,,,,,,”Hello 世界!” ,,,} } , val anyObject =new SomeClass println (anyObject (“key1”))
执行后输出结果是:
说明是调用到了相应的应用方法的。
3。我们在构造或数组,地图时,会简单的写成
val numNames =,数组(“0”,“1”,,“两”)
这里也是调用的应用方法,我们看起来好像是作用在类数组上的,其实不然,而是作用在数组的<>强伴生对象强>(对象数组)上的,调用的是伴生对象数组的,应用方法,即:
val numNames =, Array.apply(“0”,“1”,,“两”)
同样看个单例对象的例子,也解释了伴生对象的应用方法的调用
object EMail { ,,,def 应用(用户:字符串,域:,字符串):,String =, { ,,,,,,,println (“apply method “) ,,,,,,,user +,“@”, +,域 ,,,} } , val email =,电子邮件(“幻想曲”,“sina.com”) println(电子邮件)
上面代码执行后输出结果是:
对象应用是一种比较普遍用法。主要用来解决复杂<强>对象强>的初始化问题,同时也是<强>单例。强>