scala - 如何在 Scala 中定义保留前导标记的三元运算符?

标签 scala language-features scala-2.8

我正在编写一个生成 Scala 输出的代码生成器。

我需要以这样的方式模拟三元运算符,即通向“?”的标记保持不变。

例如转换表达式 c ? p : qc something .简单的if(c) p else q不符合我的标准,因为它需要放置 if(之前 c .

我的第一次尝试(仍然使用上面的 c/p/q)是

c 匹配 { case(true) => p;案例_ => q }

我发现的另一个选择是:

三元类(val g: Boolean => Any){ def |: (b:Boolean) = g(b) }

隐式 def autoTernary (g: Boolean => Any): ternary = new ternary(g)

这让我可以写:

c |: { b: Boolean => if(b) p else q }

我喜欢第二个选项的整体外观,但有没有办法让它不那么冗长?

谢谢

最佳答案

三元运算符将我的改进添加到 Rex Kerr 和 Michel Krämer 的最佳实现中:

  • 我使用 Scala 的新值类来避免装箱开销的改进。
  • 在第二个和第三个操作数上按名称调用,因此只评估所选的一个。
  • Michel 在第一个( bool )操作数上按值调用以避免按名称开销;它总是被评估。
  • 用于避免任何匿名类开销的条件的 Rex 的具体类。
  • Michel 对条件的评估以确定构造哪个类以避免两个参数构造函数的开销。

  • .
    sealed trait TernaryResult[T] extends Any {
      def |(op3: => T): T
    }
    
    class Ternary2ndOperand[T](val op2: T) extends AnyVal with TernaryResult[T] {
      def |(op3: => T) = op2
    }
    
    class Ternary3rdOperand[T](val op2: T) extends AnyVal with TernaryResult[T] {
      def |(op3: => T) = op3
    }
    
    class Ternary(val op1:Boolean) extends AnyVal {
       def ?[A](op2: => A): TernaryResult[A] = if (op1) new Ternary2ndOperand(op2) else new Ternary3rdOperand(op2)
    }
    
    object Ternary {
       implicit def toTernary(condition: Boolean) = new Ternary(condition)
    }
    

    请注意对 if else 的改进不仅仅是保存的6个字符。对于 if,Scala IDE 的关键字语法着色相同(例如紫色) , else , null , 和 true ,在某些情况下会有更好的对比度(下面的语法着色未显示此站点上当前呈现的语法):
    if (cond) true else null
    cond ? true | null
    

    关于scala - 如何在 Scala 中定义保留前导标记的三元运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2705920/

    相关文章:

    scala - 如果没有第三个成员都覆盖的具体成员,则不能覆盖具体成员

    scala - java.lang.NoClassDefFoundError : org/apache/spark/deploy/SparkSubmit

    scala - "world"在函数式编程世界中意味着什么?

    javascript - 使用关键字扩展 javascript

    scala - 如何在 Scala 中写入文件?

    scala - Set4在Scala 2.9.1中的奇怪行为?

    google-app-engine - Java GAE maven配置问题?只是另一个验证错误

    java - 使用白名单清理 html 并在白名单元素上保留一些属性

    programming-languages - 没有语法的Stata编程语言?

    language-features - 忽略 Ada 函数返回值