あなたがから継承したときに正確に何が起こる 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