1

本題に入る

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)「フー」を出力します

ここに問題がありますか、それとも何か不足していますか?

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)) }ます。

オブジェクトから文字列への変換がないため、機能していません。

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

次のScalaREPLは、ほぼ全体像を示してい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 に答える