/ / Comment “<” est-il défini pour class in ruby ​​en terme d'héritage? - ruby, classe, struct

Comment “<” est-il défini pour class in ruby ​​en terme d'héritage? - ruby, classe, struct

Qu'est-ce qui se passe exactement quand vous héritez de Struct.new au lieu d'une classe? Ou en d'autres termes, comment est le < opérateur défini pour la classe lorsqu'il est utilisé avec des objets struct au lieu d'objets de classe?

Cas 1:

class SomeClass < ParentClass; end;

Cas 2:

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

Cas 3:

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

Réponses:

2 pour la réponse № 1

Il n'y a aucune différence entre ces trois cas. Dans les trois cas, l'opérande droit de < est une expression qui, lorsqu'elle est évaluée, renvoie un Class. Dans les cas 1 et 3, il s’agit d’une constante à laquelle on fait référence, dans le cas 2, c’est un appel à une méthode.

Malgré la complexité apparente de Ruby, est plus régulier que vous ne le pensez.


3 pour la réponse № 2

Cas 1:

C’est un héritage standard qui n’implique aucune structure. Je ne suis pas sûr de ce que vous aimeriez savoir à ce sujet.

Cas 2:

Struct.new retourne une classe qui a les attributs donnés à la méthode initialize. Par exemple, la structure et la classe Foo suivantes se comportent de la même manière.

Struct.new(:bar, baz)

class Foo
attr_reader :bar, :baz

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

Etant donné que la structure et la classe ci-dessus ont le même comportement, hériter de celles-ci donnerait cette fonctionnalité à la sous-classe.

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"

Cas 3:

Ceci est identique au cas 2. La seule différence est que vous avez affecté la structure à la constante. AClass