【问题标题】:Scala classes in clojureClojure 中的 Scala 类
【发布时间】:2011-04-03 01:42:29
【问题描述】:

今天早上我有一个愚蠢的问题:我们可以使用 clojure 中的 Scala 类吗?

因为如果答案是肯定的,我一定会学习 Clojure ^^

【问题讨论】:

  • 为什么是 scala-2.8 标签?该版本有什么特定的吗?

标签: java scala clojure jvm


【解决方案1】:

Scala 类是 Java 类,您可以非常方便地使用 Clojure 中的 Java 类。

享受学习 Clojure 的乐趣。 :-)

【讨论】:

  • 并且 Cloujre 类(使用 gen-classdeftype/defrecord 创建)也可以从 Scala 中使用。下面都是字节码。
  • 不幸的是,是的。就像blank? 变成blank_QMARK。那是因为 Java(或 JVM?)不支持标识符中的此类字符。
  • 使用gen-classdefinterface + deftype(或defrecord),您可以随意调用您的方法。请注意,Clojure 本身仅在互操作场景中使用类作为实现细节(在低级别用户不一定需要了解)和(在高级别)。纯 Clojure 代码是围绕与 Java 代码完全不同的概念构建的;如果您想混合使用 Clojure 和 Java / Scala 基于类的代码,您可能会通过在 Clojure 中实现可靠的功能块然后公开包装类(这很简单)来获得最佳效果。
  • @abhin4v:当然,但是如果你真的想从 Java 调用 Clojure 函数,你会做类似clojure.lang.RT.var("clojure.core", "even?").invoke(2) 的事情,避免讨厌的修改。 (这相当于(#'clojure.core/even? 2);或者,您可以使用.get.invoke 从Var 中提取函数。)
  • @oxbow_lakes:例如,如果 Scala 有一个很好的 7zip 压缩实现,我可能会从 Clojure 调用它以避免编写我自己的版本。或者,如果它有一个很好的解析器来处理我感兴趣的某种输入,那么编写一个转换器来将该解析器返回的 Scala 数据结构转换为 Clojure 数据结构可能比重新实现整个解析器更容易(我已经用 ANTLR 做过类似的事情)。事实上,这就是我理解这个问题的意思(请注意,它是关于“使用 Clojure 中的 Scala 类”而不是“在 Clojure 中编写 Scala 代码”)。
【解决方案2】:

Scala 类,是的。 Scala 单例对象,具有与 Java 相同的年份签名。 Scala 特性,不。 Scala 含蓄,哈哈,你开玩笑的!

因此,体验的范围可能从“不错”(如果只是您的课程)到非常不愉快(例如 Scala 集合)。

【讨论】:

  • 我不知道隐式,但特征是接口,可能与辅助类相结合。 Daniel Spiewak 在 Scala/Java 互操作上有 a nice write-up,其中包括关于使用 Java 特征的部分;从这一点来看,对于非“纯抽象”的特征来说,它会变得乏味,但在 Clojure 中,大部分乏味——也许几乎所有——都可以用宏抽象掉。
【解决方案3】:

值得一提的是接受函数参数的Scala类,例如:

Option.map(f : A => B)

不太可能在 Clojure 中非常有用,因为 Clojure 编译器不会将 Clojure lambda 转换为 scala.FunctionN 的实例。我和丹尼尔在一起——我认为互操作性会很差。

【讨论】:

  • 我很确定您可以使用宏来解决可用性问题 - 基本上让宏将 Clojure lambda 包装到 scala.functionN 中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2011-03-20
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2019-05-01
相关资源
最近更新 更多