? :Java中有一个运算符,可用于根据布尔表达式选择值.例如,表达式3 > 2 ? "true" : false将返回一个字符串"true".我知道我们可以使用if表达式来做到这一点,但我更喜欢这种风格,因为它简洁而优雅.
我最近写了以下Scala:
val f: File = ... // pretend this file came from somewhere
val foo = toFoo(io.Source.fromFile(f).mkString)
Run Code Online (Sandbox Code Playgroud)
我真的不喜欢这种流动的方式.要了解发生了什么,你必须从f中间开始,向左fromFile阅读,向右mkString阅读,再向左阅读toFoo.啊.
特别是在习惯了序列的功能转换之后,这很难理解.我的下一次尝试看起来像这样:
val foo = Some(f)
.map(io.Source.fromFile)
.map(_.mkString)
.map(toFoo)
.get
Run Code Online (Sandbox Code Playgroud)
我喜欢这个更好的流程.你可以看到会发生什么这是一个很好的使用Option课程?还是我在滥用它?有没有更好的模式可以用来实现相同的流程?
我正在编写一个生成Scala输出的代码生成器.
我需要模仿一个三元运算符,使得令牌导致'?' 保持不变.
例如,将表达式转换c ? p : q为c something.简单if(c) p else q不符合我的标准,因为它需要放在if(前面c.
我的第一次尝试(仍然使用上面的c/p/q)是
c match { case(true) => p; case _ => q }
我找到的另一个选择是:
class ternary(val g: Boolean => Any) { def |: (b:Boolean) = g(b) }
implicit def autoTernary (g: Boolean => Any): ternary = new ternary(g)
这让我写:
c |: { b: Boolean => if(b) p else q }
我喜欢第二个选项的整体外观,但有没有办法让它更简洁?
谢谢
在Java中,我可以写:
Double x = (x1 > x2)? x1:x2
Run Code Online (Sandbox Code Playgroud)
但这似乎在Scala中不起作用,以下内容有错误:
var x = (x1 > x2)? x1:x2
Run Code Online (Sandbox Code Playgroud)
我不想在Scala中为此编写一段代码:
var x = x2
if (x1 > x2 ) {
x = x1
}
Run Code Online (Sandbox Code Playgroud)
如果在Scala中有更清洁的方式进行此类操作?谢谢!