Pre lepšie pochopenie Ruby som sa rozhodolznova vytvorte metódu attr_accessor. Úspešne. Teraz už chápem, ako to funguje, až na jeden detail týkajúci sa syntaktického cukru Ruby. Tu je metóda attr_accessor, ktorú som vytvoril:
def attr_accessor(*attributes)
attributes.each do |a|
# Create a setter method (obj.name=)
setter = Proc.new do |val|
instance_variable_set("@#{a}", val)
end
# Create a getter method (obj.name)
getter = Proc.new do
instance_variable_get("@#{a}")
end
self.class.send(:define_method, "#{a}=", setter)
self.class.send(:define_method, "#{a}", getter)
end
end
Ako to vidím, definoval som iba dve metódy, obj.name
ako getter a obj.name=
ako nastavovač. Ale keď spustím kód v IRB a zavolám obj.name = "A string"
stále to funguje, aj keď som metódu definoval bez medzery!
Viem, že je to iba časť mágie, ktorá definuje Ruby, ale čo presne umožňuje túto prácu?
odpovede:
2 pre odpoveď č. 1Keď vidí rubínový tlmočník obj.name = "A string
, bude ignorovať medzeru medzi name
a =
a hľadajte metódu s názvom name=
na tvojom obj
.
-1 pre odpoveď č. 2
Nevadí, „reťazec“ je úplne dobrý názov správy, skúste to
obj.send "A string" # ^_^
Môžete dokonca použiť čísla:
o = Object.new
o.define_singleton_method "555" do "kokot" end
o.send "555"