¿Qué sucede exactamente cuando heredas de Struct.new
en lugar de una clase? O en otras palabras, ¿cómo es el <
operador definido para la clase cuando se usa con objetos de estructura en lugar de objetos de clase?
Caso 1:
class SomeClass < ParentClass; end;
Caso 2
AClass = Struct.new(:value)
class SubClass < AClass; end;
Caso 3:
class SubClass < Struct.new(:value); end;
Respuestas
2 para la respuesta № 1Hay exactamente cero diferencia entre esos tres casos. En los tres casos, el operando correcto de <
es una expresión que, cuando se evalúa, devuelve un Class
. En los casos 1 y 3, es una constante que se desreferencia, en el caso 2, es una llamada al método.
A pesar de la aparente complejidad de Ruby, es más regular de lo que piensas
3 para la respuesta № 2
Caso 1:
Esta es una herencia estándar que no involucra una estructura. No estoy seguro de lo que le gustaría saber sobre esto.
Caso 2
Struct.new devuelve una clase que tiene los atributos dados al método de inicialización. Por ejemplo, la siguiente estructura y clase Foo se comportan igual.
Struct.new(:bar, baz)
class Foo
attr_reader :bar, :baz
def initialize(bar, baz)
@bar = bar
@baz = baz
end
end
Dado que la estructura y la clase anteriores tienen el mismo comportamiento, heredar de ellas le daría a la subclase esa funcionalidad.
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"
Caso 3:
Esto es idéntico al caso 2. La única diferencia aquí es que ha asignado la estructura a la constante AClass