为什么Scala';s indexOf(在列表等中)返回Int而不是选项[Int]?

为什么Scala';s indexOf(在列表等中)返回Int而不是选项[Int]?,scala,scala-collections,indexof,standard-library,api-design,Scala,Scala Collections,Indexof,Standard Library,Api Design,我想写一个非常漂亮的Scala代码list indexOf foo getOrElse Int.MaxValue,但是现在我不得不满足于那些看起来像Java的愚蠢代码val result=list indexOf foo;if(result

我想写一个非常漂亮的Scala代码
list indexOf foo getOrElse Int.MaxValue
,但是现在我不得不满足于那些看起来像Java的愚蠢代码
val result=list indexOf foo;if(result<0)Int.MaxValue else result
。Scala中的
indexOf
返回
Int
而不是
Option[Int]
这是为了与Java兼容和速度。您必须将答案双击框(首先在
java.lang.Integer
中,然后在
选项中
)而不是只返回一个负数。这可能需要十倍的时间

你可以写一些东西,将负数转换成
None
,将非负数转换成
Some(n)
,如果这让你感到困扰:

implicit class OptionOutNegatives(val underlying: Int) extends AnyVal {
  def asIndex = if (underlying < 0) None else Some(underlying)
}
隐式类OptionOutNegatives(val-underlined:Int)扩展了AnyVal{
def asIndex=如果(基础<0)没有其他一些(基础)
}

为了解决第二个问题,夹在第一个和第三个问题之间,还有其他方法可以处理索引,查找或收集满足谓词的元素

scala> ('a' to 'z').zipWithIndex find (_._1 == 'k') map (_._2)
res6: Option[Int] = Some(10)

通常情况下,您正在使用找到的元素做一些有趣的事情。

不必是这样

scala> "abcde" index 'c'
res0: psp.std.Index = 2

scala> "abcde" index 'z'
res1: psp.std.Index = -1

scala> "abcde" index 'z' match { case Index(n) => n ; case _ => MaxInt }
res2: Int = 2147483647

// Emphasizing that at the bytecode level we still return an Int - no boxing.
scala> :javap psp.std.SeqLikeExtensionOps
[...]
public abstract int index(A);
  descriptor: (Ljava/lang/Object;)I

这是从,您可以运行“sbt控制台”,然后再运行上面的程序。

我不知道为什么,可能最好在scala邮件列表中问这个问题,但是你可以很容易地使用pimp my library模式并实现你自己的
indexOf
。根据Paul Philipps的各种演讲,我看到Scala API的各个方面都是这样的,因为它与Java(或其他编程世界?)保持“兼容性”,这也应该适用于
indexOf
。关于
Comparable[a]中的
compareTo
方法,您可以问一个类似的问题
这将为您提供2^32个可能的值,而不仅仅是表示结果所需的3个值:)。对于像
compareTo
indexOf
这样的情况,可能还有一些算术值。您知道这有什么意义吗:?它似乎用find(索引)和InsertionPoint(无ADT)实现了我想要的功能。