作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在想是否透明implicit
转换真的是一个好主意,而且是否实际上更多地使用隐式更好,嗯,显式。例如,假设我有一个方法接受 Date
作为参数,我有一个隐式转换,它变成了 String
成Date
:
implicit def str2date(s: String) : Date = new SimpleDateFormat("yyyyMMdd").parse(s)
private def foo(d: Date)
implicit
来调用它转换:
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)
implicit
发现了几次我应该知道的转换(
Option
到
Iterable
任何人?)而且这种用法仍然允许我们利用
implicit
的力量s。
最佳答案
我相信,在可读性方面,更“显式”的隐式转换方式比完全透明的方式要好得多,至少在这个例子中是这样。
在我看来,使用 implicit
从类型 A
完全透明输入 B
当您始终可以查看类型为 A
的对象时就可以了可以在任何时候使用,类型为 B
的对象需要。例如,String
的隐式转换到 RandomAccessSeq[Char]
总是有意义的 - String
从概念上讲,始终可以将其视为字符序列(例如,在 C 中,字符串只是字符序列)。调用 x.foreach(println)
对所有人都有意义 String
s。
另一方面,当类型为 A
的对象时,应该使用更显式的转换。有时可以用作 B
类型的对象.在您的示例中,调用 foo("bar")
没有意义并抛出错误。由于 Scala 没有检查异常,调用 foo(s.toDate)
清楚地表明可能会抛出异常(s
可能不是有效日期)。另外,foo("bar".toDate)
显然看起来不对,而您需要查阅文档以了解原因 foo("bar")
可能是错误的。 Scala 标准库中的一个例子是来自 String
的转换。转至 Int
s,通过 toInt
RichString
的方法包装器( String
s 可以被视为 Int
s,但并非总是如此)。
关于Scala 隐式用法选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1404889/
我是一名优秀的程序员,十分优秀!