我正在编写一个生成 Scala 输出的代码生成器。
我需要以这样的方式模拟三元运算符,即通向“?”的标记保持不变。
例如转换表达式 c ? p : q
至c 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 的最佳实现中:
.
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/