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 № 1Il 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