~/rubytesting/TheRubyProgrammingLanguage/chapter8ReflectionandMetaprogramming$ cat -n ostruct.rb
1 require 'ostruct'
2
3 alu = OpenStruct.new
4 alu.nombre = "Jose"
5 alu.apellidos = "Rodriguez Quintero"
6 alu.edad = 97
7 alu.calificacion = 10
8
9 puts alu
~/rubytesting/TheRubyProgrammingLanguage/chapter8ReflectionandMetaprogramming$ ruby ostruct.rb #<OpenStruct nombre="Jose", apellidos="Rodriguez Quintero", edad=97, calificacion=10>
~/rubytesting/TheRubyProgrammingLanguage/chapter8ReflectionandMetaprogramming$ cat -n my_ostruct.rb
1 class MyOpenStruct
2 def initialize(h = {})
3 @attrs = h
4 end
5
6 def method_missing(name, *args)
7 attr = name.to_s
8 if attr =~ /=$/
9 @attrs[attr.chop] = args[0]
10 else
11 @attrs[attr]
12 end
13 end
14
15 def to_s
16 self.inspect
17 end
18 end
19
20 alu = MyOpenStruct.new
21 alu.nombre = "Jose"
22 alu.apellidos = "Rodriguez Quintero"
23 alu.edad = 97
24 alu.calificacion = 10
25
26 puts alu.nombre
27 puts alu.edad
28 puts alu.calificacion
29 puts alu
~/rubytesting/TheRubyProgrammingLanguage/chapter8ReflectionandMetaprogramming$ ruby my_ostruct.rb
Jose
97
10
#<MyOpenStruct:0x10016a408 @attrs={"nombre"=>"Jose", "calificacion"=>10, "edad"=>97, "apellidos"=>"Rodriguez Quintero"}>