在JavaScript中,编写类似的东西非常容易(且清晰易读(
var a = getString(); // say, some string, possibly null or undefined
var b = fallback(); // fallback value
var c = a || b;
在 Scala.js 中,我能做得比这更好,拥有相同的语义吗?
val a: UndefOr[String] = getString()
val b: String = fallback()
val c = a.filter(_ != null).getOrElse(b)
JS中的真实性很棘手。例如,空字符串与null
和undefined
一样虚假。因此,您的两个示例并不等同。根据您的描述,我希望第二个更正确。你的要求,有点证明了真实性是危险的。
你的第二个片段很好。如果你真的在与一个使用null
和undefined
为空的库进行接口(这已经很可疑了,即使对于 JS;通常它会是一个或另一个,但不是两个(,那么我建议你定义一个小的辅助函数:
def fromJSWithNullOrUndefined[A](x: js.UndefOr[A]): Option[A] =
x.toOption.filter(_ != null)
它一劳永逸地编码null
和undefined
都应该映射到None
的特殊行为,然后按如下方式使用它:
val c = fromJSWithNullOrUndefined(getString()).getOrElse(fallback())
Scala开发人员会发现这比开始时的||
代码更具可读性。它更惯用。