首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防范“选项”的争论?

如何防范“选项”的争论?
EN

Stack Overflow用户
提问于 2021-10-08 14:46:30
回答 2查看 54关注 0票数 0

下面我有一些scala代码,如果example的参数是true,它们应该记录"hi“。但是,这会将()记录3次。

代码语言:javascript
复制
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”,这是怎么回事?

EN

回答 2

Stack Overflow用户

发布于 2021-10-08 15:11:51

代码语言:javascript
复制
def example(runHello: Option[Boolean]) {
  // code
}

是(不推荐使用的)语法糖

代码语言:javascript
复制
def example(runHello: Option[Boolean]): Unit = {
  // code
}

除非-Ywarn-value-discard编译器选项(它将拒绝这样的代码,这就是为什么它是一个非常有用的编译器选项)有效,否则代码块可以产生任何值:因为Unit只有一个可能的值(该值是()),所以“转换”是微不足道的(尽管字面上是丢弃该值的值)。

然后,您的println将打印从调用example接收到的值(()),即()的三次打印。

我建议:

  • example的结果类型更改为Option[String]:如果给定选项包含true,则返回Some("hi");否则返回None,否则返回

使用foreach打印结果:

  • In your main

代码语言:javascript
复制
p.example(Some(true)).foreach(println _)
p.example(Some(false)).foreach(println _)
p.example(None).foreach(println _)
票数 2
EN

Stack Overflow用户

发布于 2021-10-08 15:38:50

在这篇文章中其他人的帮助下,我得到了:

代码语言:javascript
复制
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“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69497729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档