聊聊Scala编程中隐式相关的那些事儿(二)

接着第一篇讲,说说隐式值和隐式参数,隐式值和隐式参数是两个相伴相生的事物。为什么奥德斯基要在scala中使用隐式参数呢?这要从他创造Scala语言的初衷说起,他希望写程序这项工作变得高效、简单,而且优雅。

那么隐式值和隐式参数是在什么情况下应运而生的呢,我们设想一个生活中的语言场景:每天中午到了午饭时间,办公室小伙伴说的最多的两个字就是“干饭”,实际上我们干的不止是饭,还有菜,还有汤,甚至有些年轻人火力旺的还爱就点小冷饮啥的。“干饭”好比一个函数——干("饭"),其实它应该是——干("饭","菜"),但是我们不会说“走,干饭菜去!”,因为菜这个变量已经被隐藏起来了,我们不说大家都知道。编程也一样,有些数据要频繁使用,而每次在函数调用时都要传入这个数据,那么代码会显得非常笨重。

隐式值和隐式参数最基本的用法就是下面这样:

正是因为有了隐式值和隐式参数,所以每次我们只要说ganfan,实际上就把饭和菜都吃了。

隐式值和隐式参数是如何被识别的呢,和隐式函数一样,都要用到"implicit"这个关键字。同样地,隐式值和隐式参数的名称都不重要,你按规则随便取都行,但还是那句话,在需要时必须只能识别1个对应的隐式值。如果你再来个"implicit val  str2: String = "汤"",那么程序会报"ambiguous implicit values"的错误,意思就是含糊不清的隐式值。

隐式值和隐式参数的类型必须是一致的,这样才能匹配上,否则你就要显式地传入别的数据,如果不这么操作,idea编辑器会立即提示你"Unspecified value parameters",意思是未指定值参数:

 

如果在下一次使用ganfan这个函数时,你不想吃菜了,只想大饼卷着馒头就米饭吃,那么你就这么用:ganfan("大饼卷馒头")。这就给了干饭人很多的灵活性和自由选择的空间。在实际开发中也确实有这样的场景,当需要新的数据传给函数时,就传入新的数据,底层都懂你,不会傻乎乎地还去找隐式值。请注意:在使用隐式值调用函数时不要用加括号,加了括号你就要传入新的数据。

在实际项目中,隐式值和隐式参数能用到哪里呢?我稍微想了几个用处,后面我有时间再去读读Spark源码,看看隐式值和隐式参数是不是有用到。一、要频繁地使用某个IP地址,这个地址往往是固定的,所以不用每次连接都要输入IP地址变量。二、在用SparkSQL处理数据时,需要经常使用某个字段的数据,例如时间戳,这样可以将这个字段的名称定义为String类型的隐式值,这样下次使用时就不用每次都要传入这个字段名称。三、在统计分析与机器学习中,某个固定参数经常需要用到,也可以将这个固定参数声明为Int或Double类型的隐式值,这样不用每次使用都传入它。

好了,Scala编程中隐式相关的那些事儿第二部分关于隐式值和隐式参数的话题就聊到这,接下来会聊聊隐式类。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值