ruby 中的 class 在继承方面如何定义“<”?

How is "<" defined for class in ruby in term of inheritance?

当您从 Struct.new 而不是 class 继承时,究竟会发生什么?或者换句话说,当与结构对象而不是 class 对象一起使用时,如何为 class 定义 < 运算符?

案例 1:

class SomeClass < ParentClass; end;

案例二:

AClass = Struct.new(:value)
class SubClass < AClass; end;

案例 3:

class SubClass < Struct.new(:value); end;

案例一:

这是不涉及结构的标准继承。我不确定你想知道什么。

案例二:

Struct.new returns 具有给定初始化方法的属性的 class。例如,以下结构和 Foo class 的行为相同。

Struct.new(:bar, baz)

class Foo
  attr_reader :bar, :baz

  def initialize(bar, baz)
    @bar = bar
    @baz = baz
  end
end

由于上述结构和 class 具有相同的行为,从它们继承将赋予子class 该功能。

class Bar < Struct.new(:bar, :baz)
end

bar_struct = Bar.new('hello', 'world')
bar_struct.bar # => 'hello'
bar_struct.baz # => 'world'

class Bar < Foo
end

bar_class = Bar.new('hello', 'world')
bar_class.bar # => 'hello'
bar_class.baz # => 'world'

案例 3:

这与情况 2 相同。这里唯一的区别是您已将结构分配给常量 AClass

这三种情况之间的差异完全为零。在所有这三种情况下,< 的右操作数是一个表达式,当计算 returns 时,它是一个 Class。在情况 1 和 3 中,它是一个被取消引用的常量,在情况 2 中,它是一个方法调用。

尽管 Ruby 看起来很复杂,但它 比您想象的更规则。