Взгляните на следующее и посмотрите, сможете ли вы в этом разобраться:
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")
^
Здесь все выглядит вполне нормально. Но затем мы добавляем неявное преобразование.
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
И вдруг A имеет метод apply
, который принимает аргумент того же типа, который принимает функция, которую возвращает неявный!
Давайте проверим это немного подробнее:
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
Это «скрытая функция»? Если да, то как его использовать?