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 看起来很复杂,但它 比您想象的更规则。
当您从 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 看起来很复杂,但它 比您想象的更规则。