【问题标题】:Implicit Conversion from Any to Dynamic从 Any 到 Dynamic 的隐式转换
【发布时间】:2011-08-25 21:18:51
【问题描述】:

为什么以下操作不起作用? (是的,我正在使用 2.9.0final 并打开了“-Xexperimental”选项。)

implicit def any2Dynamic(a: Any) = new Dynamic {
  def applyDynamic(name: String)(args: Any*) = {
    println(a + name)
  }
}

"Say".hello // value hello is not a member of java.lang.String

人们可能会争论这有多有意义...如果这能按预期工作,"Say".toInt:StringLike.toInt(new Dynamic {...}).applyDynamic("toInt") 会发生什么优先级?

【问题讨论】:

    标签: scala dynamic-typing


    【解决方案1】:

    编译器首先通过looks 获取来自String => { def hello: ? } 的隐式视图。那失败了,所以如果String <: Dynamic,那么checks。这些没有合并。

    此动态应用功能尚未最终确定——在 Scala 2.9.0 中,它是实验性的,可能会发生变化。但我怀疑这是否会被包括在内,就像这样一个隐含的,你把所有类型安全都抛到了窗外。您永远不会因为拼写错误的方法名称或不正确的参数类型而出现编译错误。你的用例是什么?

    【讨论】:

    • 您对类型安全的权利。但是,如果我将隐式 def 限制在我的用例 implicit def X2Dynamic(x: X) = new X {...}(我的问题仍然存在,类型安全问题限制在 X)以构建具有动态调用的 DSL,那么可以调用例如在 xml 中外部定义。到目前为止只是一个实验......顺便说一句,感谢源链接!
    • 我实际上认为这种行为很棒。它可以允许在狭窄范围内使用动态语言功能。非常适合脚本或 DSL。
    • @IttayD 我也是 ;) 至少在谈到 SO 上一个体面问题的复杂答案时要记住这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 2016-05-19
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多