Chciałbym przekazać argument (y) do metody definiowanej przy użyciu define_method, jak mam to zrobić?
ruby
metaprogramming
Sixty4Bit
źródło
źródło
... i jeśli chcesz opcjonalne parametry
... tyle argumentów, ile chcesz
...kombinacja
... wszyscy
Aktualizacja
Ruby 2.0 wprowadził podwójny splat
**
(dwie gwiazdki), który ( cytuję ):... i oczywiście możesz go również użyć w definiowaniu metody :)
Przykład nazwanych atrybutów:
Próbowałem stworzyć przykład ze słowami kluczowymi argument, splat i double splat w jednym:
lub
... ale to nie zadziała, wygląda na to, że jest ograniczenie. Kiedy się nad tym zastanowić, ma to sens, ponieważ operator splat „przechwytuje wszystkie pozostałe argumenty”, a double splat „przechwytuje wszystkie pozostałe argumenty słów kluczowych”, dlatego ich mieszanie złamałoby oczekiwaną logikę. (Nie mam żadnego odniesienia, aby to udowodnić, doh!)
aktualizacja 2018 sierpień:
Artykuł podsumowujący: https://blog.eq8.eu/til/metaprogramming-ruby-examples.html
źródło
a.foo 1
zamiastfoo 1
). Dzięki!Oprócz odpowiedzi Kevina Connera: argumenty blokowe nie obsługują tej samej semantyki, co argumenty metod. Nie można zdefiniować argumentów domyślnych ani argumentów blokowych.
Zostało to naprawione tylko w Rubim 1.9 dzięki nowej, alternatywnej składni „stabby lambda”, która obsługuje pełną semantykę argumentów metod.
Przykład:
źródło
W wersji 2.2 możesz teraz używać argumentów słów kluczowych: https://robots.thoughtbot.com/ruby-2-keyword-arguments
źródło