python 关键字,python关键字及用法
掌握implicit的用法是阅读spark源代码的基础,也是学习scala其他开源框架的关键。隐式可以分为:
隐式参数隐式转换类型隐式调用函数1。隐式参数我们在定义一个方法的时候,可以把最后一个参数列表标记为隐式,表示这组参数是隐式的。一个方法只能有一个隐式参数列表,它放在方法的最后一个参数列表中。如果一个方法有多个隐式参数,那么只需要一个隐式修饰。当调用带有隐式参数的方法时,如果当前上下文中有适当的隐式值,编译器将自动为重组参数填充适当的值。如果没有编译器,将会抛出异常。当然,我们也可以为标记为隐式参数的参数手动添加默认值。def foo(n: Int)(隐式t1: String,t2: Double=3.14)
Scala def calc tax(amount:float)(implicit rate:float):float=amount * rat escala implicit val current tax=0.08 f Scala val tax=calc tax(50000 f)//4000.0如果编译器没有在上下文中找到第二行代码,就会报错。
2.类型的隐式转换使用隐式转换将变量转换为期望的类型是编译器使用隐式的第一个地方。这个规则很简单。当编译器看到类型X但需要类型Y时,它会查找从类型X到类型Y的隐式定义是否在当前范围内定义。
示例:
Scala val i: Int=3.5 //直接报错。补充这句话:Scala implicit def double 2 int(d:double)=d . toint .再次运行,无报错。scala val i: Int=3.5 //i=3 3。隐式调用函数可以转换调用方法的对象,但是比如编译器看到X .method,而类型X没有定义方法(包括基类),那么编译器会寻找从X到范围内定义的其他对象的类型转换,比如Y,类型Y定义方法。编译器会先用隐式类型转换把X转换成Y,然后调用Y的方法。
示例:
class swing type { def want learned(SW:string)=println( rabbit has learned SW)} object swing { implicit def learning type(s:aminal type)=new swing type } class AminalTypeobject aminal type extends App { import com . mobin . Scala . scalaimplicit . swimming . _ val rabbit=new aminal type rabbit . want learned( breast Roke )//breast stroke }在上面的例子中,编译器发现调用rabbit对象时没有wantLearning方法,这时,编译器会在能使其编译的作用域中寻找隐式视图。找到learningType方法后,编译器通过隐式转换将对象转换成带有该方法的对象,然后调用wantLearning方法。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。