加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala隐含使用选择

发布时间:2020-12-16 09:45:07 所属栏目:安全 来源:网络整理
导读:我一直在想,透明的隐式转换是否真的是一个好主意,以及是否真的可以更好地明确地使用implicits。例如,假设我有一个接受Date作为参数的方法,并且我有一个隐式转换,将一个String变成一个Date: implicit def str2date(s: String) : Date = new SimpleDateF
我一直在想,透明的隐式转换是否真的是一个好主意,以及是否真的可以更好地明确地使用implicits。例如,假设我有一个接受Date作为参数的方法,并且我有一个隐式转换,将一个String变成一个Date:

implicit def str2date(s: String) : Date = new SimpleDateFormat("yyyyMMdd").parse(s)

private def foo(d: Date)

那么显然我可以用透明的隐式转换来调用它:

foo("20090910")

更好的做法是将字符串转换为更明确的日期吗?

class DateString(val s: String) { 
  def toDate : Date = new SimpleDateFormat("yyyyMMdd").parse(s) 
}

implicit def str2datestr(s: String) : DateString = new DateString(s)

那么用法看起来更像:

foo("20090910".toDate)

这样做的优点是在以后发生的事情更加清晰 – 现在我已经被透明隐式转换了几次,我应该知道(可选的任何人),这个用法仍然允许我们利用蕴含的力量。

解决方法

我相信,透明度更高的方式在可读性方面比完全透明的更好,至少在这个例子中。

在我看来,当您可以随时查看类型为A的对象,每当需要使用类型B的对象时,都可以将类型A到类型B完全透明地使用暗示。例如,将字符串隐式转换为RandomAccessSeq [Char]总是有意义的 – 一个String可以总是在概念上被视为一个字符序列(例如,C中,一个字符串只是一个字符序列)。调用x.foreach(println)对所有字符串都是有意义的。

另一方面,当类型A的对象有时可以用作类型B的对象时,应该使用更明确的转换。在您的示例中,对foo(“bar”)的调用没有意义并且会引发错误。由于Scala没有检查异常,调用foo(s.toDate)清楚地表明可能会抛出异常(可能不是有效的日期)。此外,foo(“bar”.toDate)显然看起来错误,而您需要查阅文档以了解为什么foo(“bar”)可能是错误的。 Scala标准库中的一个示例是通过RichString包装器的toInt方法将字符串转换为Ints(字符串可以看作是Ints,但并不是所有的时间)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读