在很多场合,我在的形式使用参数Option与None默认值-这样的:
def foo(bar:Option[String] = None)
Run Code Online (Sandbox Code Playgroud)
这很方便,让我可以轻松省略nulls.但是,如果我这样做,我需要将方法的每次调用都更改为
foo(Some("bar"))
Run Code Online (Sandbox Code Playgroud)
而不是简单的
foo("bar")
Run Code Online (Sandbox Code Playgroud)
然而,这看起来有点多余,因为很明显,当我指定一个值时,它是一个完整的选项.我很确定我可以尝试编写一些隐式转换器来为我做这样的包装 - 不幸的是,我不知道如何.
奖金 - 这是一个理智的事情吗?有没有其他方法来处理"可空"参数问题?
我会给你一些选择(双关语).
不要使用可选参数,而是使用Option.apply.当参数不一定是可选的,但您想要处理null传递的可能值时,这很有用.
def foo(bar: String): ?? = Option(bar)... // operate on the Option[String]
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,Option.apply自动转换null到None你,所以绝对没有必要使用的if/else.
对非可选参数使用重载.当参数是真正可选的时候更是如此,但是为您提供了传递Option包装或解包的便利.但是,如果不首先null知道类型,就不可能通过这里.
def foo(bar: String): ?? = foo(Option(bar))
def foo(bar: Option[String]): ?? = ???
Run Code Online (Sandbox Code Playgroud)
例:
def foo(bar: String): Option[String] = foo(Option(bar))
def foo(bar: Option[String]): Option[String] = bar.map(_ + "aaa")
scala> foo("bbb")
res7: Option[String] = Some(bbbaaa)
scala> foo(null: String) // The String ascription is necessary here.
res9: Option[String] = None
scala> val str: String = null
scala> foo(str) // No ascription necessary, since we know the type.
res10: Option[String] = None
Run Code Online (Sandbox Code Playgroud)
隐式转换任何东西Option.
implicit def any2Opt[A](value: A): Option[A] = Option(value)
Run Code Online (Sandbox Code Playgroud)
并保持目前的定义
def foo(bar: Option[String]): ?? = ???
Run Code Online (Sandbox Code Playgroud)
Option然而,隐含地转换为可能导致一些意想不到的结果,所以要小心.
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |