struct/shaped_by_initialize.rb
tests/_examples/struct/shaped_by_initialize.rb in the metorex repository.
# A Struct writes its own `initialize`: it is private, assigns the members it
# is given, and a struct class built from a subclass of Struct stands under
# that subclass.
Point = Struct.new :x, :y
p Point.private_instance_methods(false).include?(:initialize) ||
Struct.private_instance_methods(false).include?(:initialize)
here = Point.new 1, 2
here.instance_eval { initialize 3, 4 }
p [here.x, here.y]
here.instance_eval { initialize 5 }
p [here.x, here.y]
begin
here.instance_eval { initialize 6, 7, 8 }
rescue ArgumentError => error
p error.message
end
class Tagged < Struct
attr_reader :tag
def initialize(*)
@tag = :tagged
super
end
end
Labelled = Tagged.new :name
held = Labelled.new "held"
p [held.name, held.tag]
p Labelled.superclass == Tagged
Output:
true
[3, 4]
[5, nil]
"struct size differs"
["held", :tagged]
true