Scala以Option[Boolean]为入参的方法无法输出'hi'问题排查
问题原因分析
- 方法定义语法错误导致返回值固定为
Unit
Scala规定,如果方法定义时省略了等号=,直接在参数列表后写大括号方法体,该方法的返回值类型强制为Unit,对应的值就是你打印出来的()。你的example方法就用了这种写法,所以无论内部逻辑如何,最终返回值都是(),这是三次调用都输出()的核心原因。
- 方法定义语法错误导致返回值固定为
- 业务逻辑判断条件错误
你预期的是入参runHello为Some(true)时才返回hi,但现有代码的判断条件是runHello.isDefined,只要入参是Some包裹的内容(不管是true还是false)都会进入分支,完全不符合设计要求,正确的判断条件应该是runHello.contains(true)。
- 业务逻辑判断条件错误
- 方法返回值逻辑错误
Scala方法的返回值为方法体最后一个表达式的值,你的example方法体最后一行是None,就算修正了等号问题,该方法最终也只会返回None,不会返回hello方法的执行结果。同时你在分支内仅写了hello,如果没有作为返回值处理的话,这个调用的结果会被直接丢弃。
- 方法返回值逻辑错误
修正后的代码示例
class Poplar { def hello(): String = "hi" // 加等号明确要返回值,返回类型为Option[String]符合入参设计 def example(runHello: Option[Boolean]): Option[String] = { if (runHello.contains(true)) { Some(hello()) } else { None } } } object Main extends App { val p = new Poplar() // 需要直接输出字符串hi可以调用getOrElse解包Option println(p.example(Some(true)).getOrElse("")) // 输出 hi println(p.example(Some(false))) // 输出 None println(p.example(None)) // 输出 None }
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

