我一直想知道为什么在斯卡拉来确定某种元素的位置的集合中(例如各种索引方法List.indexOf
,List.indexWhere
)返回-1
指示,而不是更地道缺乏集合中的给定元素的,Option[Int]
.有一些特别的优势,以返回-1
代替None
,或者这只是由于历史的原因?
这只是出于历史原因,但人们想知道历史原因是什么:历史是什么,为什么会这样呢?
直接历史记录是java.lang.String.indexOf
返回索引的方法,如果找不到匹配的字符,则返回-1.但这并不新鲜; 如果在字符串中找不到字符,则Fortran SCAN函数返回0,这与Fortran使用1索引的情况相同.
这样做的原因是字符串只有正长度,所以任何负长度都可以用作一个None
没有任何拳击开销的值. -1
是最方便的负数,所以就是这样.
如果编译器不够聪明,无法实现所有装箱和拆箱以及一切都无关紧要,这可以加起来.特别是,对象创建往往需要5-10 ns,而函数调用或比较通常需要1-2 ns,因此如果集合很短,创建一个新对象可能会有相当大的分数惩罚(更多如果你的记忆已被征税,GC有很多工作要做).
如果Scala最初有一个惊人的优化器,那么选择可能会有所不同,因为人们只会用选项编写东西,这更安全而不是特殊情况,然后相信编译器将其转换为适当的高性能码.
归档时间: |
|
查看次数: |
912 次 |
最近记录: |