因此,隐式转换可能非常令人困惑,因为有3种方法可以做到这一点,以及它处理范围的方式,这个问题的想法就是清除一些误解,就像我所拥有的许多误解一样。
参考:
class Demo {
def test(in:Option[Int] = None) {
println(in.getOrElse(0))
}
}
如果在传递它的函数中不接受类型A
,只需将隐式转换尝试从类型B
转换为类型A
,但键入{{ 1}}是。
B
范围
已经有很多链接详细讨论了范围,但我最大的误解是我认为你可以在类中定义隐式转换然后在类的使用方面,程序员可以例如传递类型{{ 1}}进入一个函数,它将隐式地将其转换为仅适用于该类的val d = new Demo
d.test() //prints 0
d.test(Some(2)) //prints 2
d.test(3) //should print 3
//but will only if you import the following
//into the scope where the function is CALLED
implicit def intToOption(in:Int):Option[Int] = Some(in)
。
像这样:
A
这有很多价值,因为它会阻止愚蠢的B
包装变量,并且在使用class Demo {
implicit def intToOption(in:Int):Option[Int] = Some(in)
def test(in:Option[Int] = None) {
println(in.getOrElse(0))
}
}
val d = new Demo
d.test() //prints 0
d.test(Some(2)) //prints 2
d.test(3) //should print 3 without any imports or implicit definitions
而不是null时坚持使用scala最佳做法。
但是没有骰子,你必须明确定义或导入转换到你调用函数的范围,这导致反对者的军队有效说,你应该避免它,因为它可能会导致一些奇怪的错误和奇怪的调试。因为我认为定义特定类的转换对于类的用户来说更有用,并且更简洁,并且有助于scalas最佳实践,因此使得implicits有限。
为什么scala不这样做?或者更具体地说为什么scala不应该这样做?
您发现或处理scalas的其他误解或常见错误是什么意思?