【发布时间】:2019-11-12 22:06:29
【问题描述】:
Some("abcdefg").get(3) //res0: Char = d
get() 的参数被发送到String 的apply() 方法,但Option(和Some)的source code 没有带参数的get() 方法,而String 根本没有get 方法。
那么get() 被调用的是什么?是爪哇地的鼹鼠吗?
【问题讨论】:
Some("abcdefg").get(3) //res0: Char = d
get() 的参数被发送到String 的apply() 方法,但Option(和Some)的source code 没有带参数的get() 方法,而String 根本没有get 方法。
那么get() 被调用的是什么?是爪哇地的鼹鼠吗?
【问题讨论】:
隐式转换为StringOps.apply
augmentString(Some("abcdefg").get)(3)
augmentString 在哪里
@inline implicit def augmentString(x: String): StringOps = new StringOps(x)
【讨论】:
实际上,在这种情况下,.get(x) 不是单独的get() 方法,而是.get.apply(x) 的缩写。所以这是Some 类型上的标准get 方法。不需要隐式。
Some(Seq(99,32,12,7,101)).get(3) //res0: Int = 7
非常感谢@Mario Galic 为我指明了正确的方向。
【讨论】:
get 方法不进行复制。调用apply() 时可能会发生其他事情,但get 本身非常简单:final case class Some[+A](value: A) extends Option[A] {def get: A = value}