Scala隐含使用选择
我一直在想,透明的隐式转换是否真的是一个好主意,以及是否真的可以更好地明确地使用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,但并不是所有的时间)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |