gpt4 book ai didi

scala - 令人困惑的 Scala 动态代码片段

转载 作者:行者123 更新时间:2023-12-01 05:39:10 25 4
gpt4 key购买 nike

我在 Scala 邮件列表中遇到了以下代码片段:

scala> class DynamicImpl(x: AnyRef) extends Dynamic {
| def _select_(name: String): DynamicImpl = {
| new DynamicImpl(x.getClass.getMethod(name).invoke(x))
| }
| def _invoke_(name: String)(args: Any*) = {
| new DynamicImpl(x.getClass.getMethod(name, args.map(_.asInstanceOf[AnyRef].getClass) : _*).invoke(x, args.map(_.asInstanceOf[AnyRef]) : _*))
| }
| override def typed[T] = x.asInstanceOf[T]
| override def toString = "Dynamic(" + x.toString + ")"
| }
defined class DynamicImpl

scala>

scala> implicit def toDynamic(x: Any): Dynamic = new DynamicImpl(x.asInstanceOf[AnyRef])
toDynamic: (x: Any)Dynamic

scala> class Duck {
| def quack = "Quack!"
| }
defined class Duck

scala> class QuackingSwan {
| def quack = "Swack!"
| }
defined class QuackingSwan

scala> def makeQuack(d: Dynamic) {
| println(d.quack.typed[String])
| }
dynatype: d._select_("quack")
makeQuack: (d: Dynamic)Unit

scala> makeQuack(new Duck)
Quack!

scala> makeQuack(new QuackingSwan)
Swack!

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!)

scala> s.length
dynatype: line8$object.$iw.$iw.s._select_("length")
res3: Dynamic = Dynamic(13)

scala> s.isEmpty.typed[Boolean]
dynatype: line8$object.$iw.$iw.s._select_("isEmpty")
res4: Boolean = false

什么是 _select__invoke_这里?

最佳答案

_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_为任何带参数的方法调用。

关于scala - 令人困惑的 Scala 动态代码片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6776053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com