_select_
и _invoke_
ведут себя как Ruby missing_method
.Когда какой-либо метод вызывается для динамического экземпляра, который не реализует метод, вместо этого вызывается _select_
или _invoke_
.Эти два метода могут быть реализованы по вашему желанию.
В вашем примере они используют рефлексию для вызова фактической реализации члена x
.Например:
scala> val s: Dynamic = "Hello, world!"
s: Dynamic = Dynamic(Hello, world!)
scala> s.toLowerCase
dynatype: line8$object.$iw.$iw.s._select_("toLowerCase")
res2: Dynamic = Dynamic(hello, world!)
Метод toLowerCase
не определен в s
.Таким образом, метод _select_
вызывается вместо аргумента "toLowerCase"
.Затем динамический механизм вызовет x.toLowerCase
, используя отражение, и обернет результат в новый динамический экземпляр.
_select_
вызывается для любого метода без аргументов, тогда как _invoke_
вызывается для любого метода с аргументами.