下面我有一些scala代码,如果example的参数是true,它们应该记录"hi“。但是,这会将()记录3次。
class Poplar {
def hello (): String =
"hi"
def example (runHello: Option[Boolean]) {
if (runHello.isDefined) hello
None
}
}
object Main extends App {
val p = new Poplar()
println(p.example(Some(true)))
println(p.example(Some(false)))
println(p.example(None))
}上面的代码不允许代码记录“hi”,这是怎么回事?
发布于 2021-10-08 15:11:51
def example(runHello: Option[Boolean]) {
// code
}是(不推荐使用的)语法糖
def example(runHello: Option[Boolean]): Unit = {
// code
}除非-Ywarn-value-discard编译器选项(它将拒绝这样的代码,这就是为什么它是一个非常有用的编译器选项)有效,否则代码块可以产生任何值:因为Unit只有一个可能的值(该值是()),所以“转换”是微不足道的(尽管字面上是丢弃该值的值)。
然后,您的println将打印从调用example接收到的值(()),即()的三次打印。
我建议:
example的结果类型更改为Option[String]:如果给定选项包含true,则返回Some("hi");否则返回None,否则返回使用foreach打印结果:
mainp.example(Some(true)).foreach(println _)
p.example(Some(false)).foreach(println _)
p.example(None).foreach(println _)发布于 2021-10-08 15:38:50
在这篇文章中其他人的帮助下,我得到了:
class Poplar {
def hello (): String =
"hi"
def example (runHello: Option[Boolean]): Option[String] = {
val rh = runHello.getOrElse(false)
if (rh) Some(hello)
else None
}
}
object Main extends App {
val p = new Poplar()
println(p.example(Some(true)))
println(p.example(Some(false)))
println(p.example(None))
}它只记录第一个println的"hi“。
https://stackoverflow.com/questions/69497729
复制相似问题