gpt4 book ai didi

Scala 隐式用法选择

转载 作者:行者123 更新时间:2023-12-03 11:06:10 24 4
gpt4 key购买 nike

我一直在想是否透明implicit转换真的是一个好主意,而且是否实际上更多地使用隐式更好,嗯,显式。例如,假设我有一个方法接受 Date作为参数,我有一个隐式转换,它变成了 StringDate :

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 发现了几次我应该知道的转换( OptionIterable 任何人?)而且这种用法仍然允许我们利用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com