当我们做一些(“某些值”)。尺寸时它返回1。 当我们执行None.size时,它返回0。 我想知道什么可能在选项上使用size方法。
val x = Some(1,2,3,4).size
println(x) // prints 1
val y = Some(List(“a”, ”b”, ”c”, ”d”))
println(y) //it also print 1
当我们在Some中有任何类型的值时为1,而对于None则为0。这种尺寸方法比Option更有用。
我能想到的一个可能用途是知道在(某些)情况下是否定义了该选项,并且当None和size为0时,size是否为1。
但是没有意义,因为我们已经有了isDefined来检查它。
答案 0 :(得分:5)
size
方法与Option
也是monad的事实没有任何关系。 monad
的概念很普遍,它适用于很多事情,而所有这些事情通常会有更多的方法只有unit
和flatMap
。 Option
有一个size
方法,因为它可以通过Option.option2iterable
隐式转换为Iterable
。这是有道理的,因为Option
是一个最多只有一个元素的集合。
我没有看到isDefined
应该"更有意义的任何理由"比size
。这些方法都不是绝对必要的。实际上,Option
上的所有方法只能用fold
表示。例如,isDefined
可以定义为
def isDefined = fold(false){ _ => true }
同样,size
也可以通过fold
:
def size = fold(0){ _ => 1 }
现在是否意味着我们应该抛弃除fold
之外的所有方法?一点都不。 "丰富的界面"实现了提供大量派生方法的特征可能是Scala的集合使用起来比使用Java集合更加愉快的主要原因。到目前为止,差异已经变小了,因为Java还引入了类似的默认方法实现,但这再次表明丰富的接口本质上是有用的。
答案 1 :(得分:3)
添加了size
方法,因为Options
已隐式转换为Iterable。 Iterable
提供吨有用的方法,而无需为Options
专门重新实现。通过重用该代码,Options
可以与所有其他容器保持一致,并且可以自行重复使用。
换句话说,它允许您将Option
传递给期望Iterable
的函数,其中该函数仅知道size
而非Option
等方法。像isDefined
这样的方法。
实际上,isDefined
是您并不严格需要的方法,因为它只对狭窄的Option
类型有意义。它只是提供一个语义上比size
或isEmpty
更好的名称。