切入追逐
将“转换”int转换为String
implicit def int2string(i: Int): String = {
"foo"
}
采用String并打印
的方法def printString(i: String) = print(i)
使用Int参数调用printString
printString(_:Int)
不应该显示“foo”吗?但是printString(i:String)
永远不会被调用。
printString(1)
打印“foo”
这里有问题或我遗失了什么?
答案 0 :(得分:6)
那是因为printString(_:Int)
实际上它的作用是将该表达式转换为一个接受Int的函数,并且可能永远不会被调用...参见:
scala> implicit def int2string(i: Int): String = "foo"
int2string: (i: Int)String
scala> def printString(i: String) = print(i)
printString: (i: String)Unit
此处没有语法错误意味着它正在运行。举例说明:
scala> printString(_:Int) // Function from Int to Unit
res0: Int => Unit = <function1>
编译器将外部表达式转换为{ x:Int => printString(x) }
,然后应用隐式转换,因为隐式在范围内,因此结果为{ x:Int => printString(int2string(x)) }
。
非工作的,因为没有从Object转换为String:
scala> printString(_:Object)
<console>:10: error: type mismatch;
found : java.lang.Object
required: String
printString(_:Object)
现在要实际看到我们需要调用它的打印:
scala> val foo = printString(_:Int)
foo: Int => Unit = <function1>
scala> foo(5)
foo
答案 1 :(得分:1)
下面的Scala REPL几乎讲述了整个故事,它永远不会被调用是因为printString(_:Int)
不是函数调用。您正在创建一个新功能。
如果你直接传入了int,那一切都没问题。
scala> implicit def int2string(i: Int): String = {
| "foo"
| }
int2string: (i: Int)String
scala> def printString(i: String) = print(i)
printString: (i: String)Unit
scala> val x = printString(_:Int)
x: Int => Unit = <function1>
scala> x(10)
foo
// This works because you have implicit def,
// and this will be printString(int2string(10))
// when your argument is a Int.
scala> printString(10)
foo
scala>