私はScalaにこのクラスを持っています:
object Util {
class Tapper[A](tapMe: A) {
def tap(f: A => Unit): A = {
f(tapMe)
tapMe
}
def tap(fs: (A => Unit)*): A = {
fs.foreach(_(tapMe))
tapMe
}
}
implicit def tapper[A](toTap: A): Tapper[A] = new Tapper(toTap)
}
今、
"aaa".tap(_.trim)
コンパイルされず、エラーが発生します
エラー:拡張関数のパラメータータイプがありません((x $ 1)=> x $ 1.trim)
タイプが推測されないのはなぜString
ですか?エラーから、暗黙の変換が発生するようです(そうでない場合、エラーは「tap
クラスのメンバーではありません」の行に沿って発生しますString
)。そして、変換はにならなければならないようです。Tapper[String]
つまり、引数のタイプはString => Unit
(または(String => Unit)*
)です。
興味深いのは、どちらかの定義をコメントアウトするとtap
、コンパイルされることです。