隐含的Scala bug还是我?

时间:2012-09-01 01:00:39

标签: scala

切入追逐

将“转换”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”

这里有问题或我遗失了什么?

2 个答案:

答案 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>