【问题标题】:Conditional compilation in ScalaScala 中的条件编译
【发布时间】:2011-07-05 08:14:47
【问题描述】:

我正在开发一个依赖于 Scala 2.9 但仅用于次要功能的库。我想提出与 2.8 兼容的版本,但我不想维护两个代码分支。由于我使用的是 SBT,我想从它的交叉编译功能中受益。

但是我不知道是否有一种方法可以提供等效的条件编译,仅在使用 Scala 2.9 时才包含一段代码。反射性可能是一种选择(但如何?)。

编辑:我在 2.9 中使用的功能是新的 sys 包对象。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    我通过反思得到了它。所以如果我想得到sys.SystemProperties,我可以这样做:

    try {
        val k = java.lang.Class.forName("scala.sys.package$")
        val m = k.getMethod( "props" )
        // etc.
    } catch {
        case _ => throw new UnsupportedOperationException("Only available with Scala 2.9")
    }
    

    但它是如此无聊和丑陋,我想我会放弃那些功能......

    【讨论】:

    • 你不应该抓住像NoSuchMethodException这样的东西吗?
    • 我捕捉到了一切,因为所有的反射步骤都可能导致抛出异常。
    • 很公平。在做这类事情时,我通常会打开 InvocationTargetExceptions 以使其更透明。
    【解决方案2】:

    阅读这篇博文,它描述了如何使用元编程来做到这一点:

    http://michid.wordpress.com/2008/10/29/meta-programming-with-scala-conditional-compilation-and-loop-unrolling/

    【讨论】:

    • 谢谢!但由于我引用了 Scala 2.8 中不存在的代码(见编辑),它不会编译。
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 2018-03-14
    • 2023-03-04
    • 2012-10-08
    • 2012-06-23
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多