/ /継承の観点から、ルビのクラスに“ <”はどのように定義されていますか? - ルビー、クラス、構造体

どのように "<"は継承の観点からルビのクラスに対して定義されていますか? - ルビ、クラス、構造体

あなたがから継承したときに正確に何が起こる Struct.new 代わりにクラスから?あるいは言い換えれば、 < クラスオブジェクトの代わりに構造体オブジェクトと一緒に使用する場合、演算子はクラスに対して定義されますか。

ケース1:

class SomeClass < ParentClass; end;

ケース2:

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

ケース3:

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

回答:

回答№1は2

これら3つの場合の違いはまったくありません。 3つの場合すべてにおいて、の右側のオペランド < 式です。評価されると、 Class。ケース1と3では、それは間接参照される定数で、ケース2ではメソッド呼び出しです。

Rubyの明らかな複雑さにもかかわらず、それは あなたが思うよりももっと規則的に。


回答№2の場合は3

ケース1:

これは構造体を必要としない標準的な継承です。私はあなたがこれについて知りたいのかよくわかりません。

ケース2:

Struct.newは、initializeメソッドに指定された属性を持つクラスを返します。たとえば、次の構造体とFooクラスは同じように動作します。

Struct.new(:bar, baz)

class Foo
attr_reader :bar, :baz

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

上記のstructと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