Jak mogę zrobić to, o czym oni tutaj mówią , ale w Rubim?
Jak wykonałbyś funkcję na obiekcie? i jak wykonałbyś funkcję globalną (zobacz odpowiedź jetxee we wspomnianym poście)?
PRZYKŁADOWY KOD:
event_name = "load"
def load()
puts "load() function was executed."
end
def row_changed()
puts "row_changed() function was executed."
end
#something here to see that event_name = "load" and run load()
AKTUALIZACJA: Jak dostać się do metod globalnych? czy moje funkcje globalne?
Wypróbowałem tę dodatkową linię
puts methods
oraz load i row_change, jeśli nie są wymienione.
ruby
metaprogramming
BuddyJoe
źródło
źródło
Trzy sposoby:
send
/call
/eval
- i ich punkty odniesieniaTypowe wywołanie (w celach informacyjnych):
Za pomocą
send
Za pomocą
call
Za pomocą
eval
Benchmarki
Podziękowania dla tego wpisu na blogu, który zawiera nieco więcej informacji na temat trzech metod, a także pokazuje, jak sprawdzić, czy metody istnieją.
źródło
Class.send("classVariable") = 5
? To powoduje błąd. Czy można to obejść? To samo dotyczy używaniaClass.method("classVariable").call() = 5
call
uwzględniać tworzenia wystąpienia metody object (m.test.method(:length)
) w celu dokładnego odzwierciedlenia czasu rzeczywistego? Podczas korzystaniacall
jesteś prawdopodobnie będzie instancję obiektu metodę za każdym razem.Użyj tego:
Proste, prawda?
Jeśli chodzi o globalne , myślę, że sposób w Ruby polegałby na przeszukaniu go za pomocą
methods
metody.źródło
"my_string".method('blah') #=> NameError: undefined method
bla 'dla klasyString'
Osobiście ustawiłbym hash do funkcji referencji, a następnie użyłbym ciągu jako indeksu do skrótu. Następnie wywołujesz odwołanie do funkcji z jej parametrami. Ma to tę zaletę, że nie pozwala złemu łańcuchowi wywołać czegoś, czego nie chcesz wywołać. Innym sposobem jest w zasadzie
eval
sznurek. Nie rób tego.PS nie bądź leniwy i faktycznie wpisz całe swoje pytanie, zamiast tworzyć link do czegoś.
źródło