Jetez un œil à ce qui suit et voyez si vous pouvez y trouver un sens :
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) Client VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class A
defined class A
scala> val a = new A
a: A = A@1643e4b
scala> a.apply("foo")
<console>:8: error: value apply is not a member of A
a.apply("foo")
^
Il semble tout à fait normal jusqu'ici. Mais ensuite nous ajoutons une conversion implicite.
scala> implicit def anyToFunc(any: Any) = { x: String => "bar" }
anyToFunc: (any: Any)(String) => java.lang.String
scala> a.apply("foo")
res1: java.lang.String = bar
Et soudain, A a un apply
qui accepte un argument du même type que celui de la fonction que l'implicite retourne !
Inspectons-la un peu plus :
scala> class B { override def toString = "an instance of class B" }
defined class B
scala> implicit def anyToFunc(any: Any) = { x: String =>
| println("any is " + any.toString)
| println("x is " + x)
| "bar" }
anyToFunc: (any: Any)(String) => java.lang.String
scala> val b = new B
b: B = an instance of class B
scala> b.apply("test")
any is an instance of class B
x is test
res8: java.lang.String = bar
S'agit-il d'une "fonction cachée" ? Si oui, à quoi sert-elle ?