1

切入正题

“转换” int 为字符串

 implicit def int2string(i: Int): String = {
    "foo"
  }

接受字符串并打印的方法

def printString(i: String) = print(i)

使用 Int 参数调用 printString

printString(_:Int)

那不应该显示“foo”吗?但是printString(i:String)永远不会被调用。

printString(1)打印“富”

这里有问题还是我遗漏了什么?

4

2 回答 2

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
于 2012-09-01T01:06:06.910 回答
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>
于 2012-09-01T01:12:21.263 回答