.get(x)行为从何而来?

jwv*_*wvh 6 scala standard-library

Some("abcdefg").get(3)  //res0: Char = d
Run Code Online (Sandbox Code Playgroud)

的参数get()被发送到apply()的方法String,但源代码Option(和Some)不具有get()其需要的参数,和方法String不具有get在所有的方法。

那么get()正在调用什么呢?它是爪哇岛的一颗痣吗?

Mar*_*lic 6

StringOps.apply来自隐式转换

augmentString(Some("abcdefg").get)(3)
Run Code Online (Sandbox Code Playgroud)

这里augmentString

@inline implicit def augmentString(x: String): StringOps = new StringOps(x)
Run Code Online (Sandbox Code Playgroud)


jwv*_*wvh 6

实际上,在这种情况下,这.get(x)不是单独的get()方法,而是的缩写.get.apply(x)。因此,这是getSome类型的标准方法。不需要隐式。

Some(Seq(99,32,12,7,101)).get(3)  //res0: Int = 7
Run Code Online (Sandbox Code Playgroud)

非常感谢@Mario Galic向我指出正确的方向。

  • @ChaitanyaWaikar; get方法不进行复制。调用`apply()`时可能会发生其他情况,但是`get`本身很简单:`最终案例类Some [+ A](value:A)扩展了Option [A] {def get:A = value}` (2认同)