OCaml 对象实例变量解析

OCaml object instance variable resolution

我被这个咬了

class root = object

  val bars = "123"

end

class derived bars = object

  inherit root as super

  method speak =
    print_endline bars

end

let () =
  let a = new derived "hello" in
  a#speak

令人惊讶地打印出“123”而不是 "hello"。

1) 这是否意味着实例变量是通过首先查看最 class 的根来解析的?

2) 假设 1,是否可以确保实例变量从当前 class 向上解析到父 class? (我怀疑这是可能的,因为 "its just how objects work in OCaml")

3) 是否有编译器warning来防止,warn about this

我认为它只是

的变体
let f bars =
  let bars = "123" in
  print_endline bars

第二个值bars隐藏了第一个。 inherit root 扩展为 val bars = "123" 并隐藏您的 bars 值。

你可以做什么来覆盖 bars

class derived x = object
  inherit root as super
  val bars = x
  method speak =
    print_endline bars
end