/ / Ruby definuje attr_accessor magickú metódu - ruby

Rubín attr_accessor čarovnú metódu definovania - ruby

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ď č. 1

Keď 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"