Nowy w Ruby i ROR i uwielbiam to każdego dnia, więc oto moje pytanie, ponieważ nie mam pojęcia, jak to wygooglować (i próbowałem :))
mamy metodę
def foo(first_name, last_name, age, sex, is_plumber)
# some code
# error happens here
logger.error "Method has failed, here are all method arguments #{SOMETHING}"
end
Więc czego szukam sposobu, aby uzyskać wszystkie argumenty przekazane do metody, bez wymieniania każdego z nich. Ponieważ to jest Ruby, zakładam, że jest sposób :) Gdyby to była java, po prostu je wymieniłbym :)
Wynik byłby:
Method has failed, here are all method arguments {"Mario", "Super", 40, true, true}
ruby-on-rails
ruby
Haris Krajina
źródło
źródło
method(__method__).parameters.map { |_, v| [v, binding.local_variable_get(v)] }
Odpowiedzi:
W Rubim 1.9.2 i nowszych wersjach możesz użyć tej
parameters
metody na metodzie, aby uzyskać listę parametrów tej metody. To zwróci listę par wskazujących nazwę parametru i czy jest on wymagany.na przykład
Jeśli zrobisz
następnie
Możesz użyć specjalnej zmiennej,
__method__
aby uzyskać nazwę bieżącej metody. Tak więc w ramach metody nazwy jej parametrów można uzyskać za pośrednictwemNastępnie możesz wyświetlić nazwę i wartość każdego parametru za pomocą
Uwaga: ponieważ ta odpowiedź została pierwotnie napisana, w obecnych wersjach Rubiego
eval
nie można już wywołać za pomocą symbolu. Aby rozwiązać ten problem,to_s
podczas budowania listy nazw parametrów, tjparameters.map { |arg| arg[1].to_s }
źródło
Od Ruby 2.1 możesz używać binding.local_variable_get do odczytywania wartości dowolnej zmiennej lokalnej, w tym parametrów metody (argumentów). Dzięki temu możesz poprawić zaakceptowaną odpowiedź, której chcesz uniknąć
złoeval.źródło
Hash[method(__method__).parameters.map.collect { |_, name| [name, binding.local_variable_get(name)] }]
Jednym ze sposobów rozwiązania tego problemu jest:
źródło
To ciekawe pytanie. Może używając local_variables ? Ale musi być inny sposób niż użycie eval. Szukam w dokumencie Kernel
źródło
eval var.to_s
. Zastrzeżeniem jest również to, że jeśli zdefiniujesz jakiekolwiek zmienne lokalne przed uruchomieniem tej pętli, zostaną one uwzględnione jako dodatek do parametrów metody.local_variables
, zwróci ona argumenty metody + wszystkie zmienne lokalne. Może to powodować błędy, gdy twój kod.To może być pomocne ...
źródło
callers_name
implementacji, możesz również przekazać__method__
razem zbinding
.Możesz zdefiniować stałą, taką jak:
I użyj go w swoim kodzie, na przykład:
źródło
Zanim przejdę dalej, przekazujesz zbyt wiele argumentów do foo. Wygląda na to, że wszystkie te argumenty są atrybutami modelu, prawda? Naprawdę powinieneś mijać sam obiekt. Koniec wypowiedzi.
Możesz użyć argumentu „splat”. Wsuwa wszystko do tablicy. Wyglądałoby to tak:
źródło
Jeśli chcesz zmienić sygnaturę metody, możesz zrobić coś takiego:
Lub:
W tym przypadku interpolowana
args
lubopts.values
będzie tablicą, ale możesz,join
jeśli na przecinku. Twoje zdrowieźródło
Wygląda na to, że to, co próbuje osiągnąć to pytanie, można zrobić za pomocą klejnotu, który właśnie wydałem, https://github.com/ericbeland/exception_details . Wyświetli zmienne lokalne i wartości (i zmienne instancji) z uratowanych wyjątków. Może warto rzucić na to okiem...
źródło
better_errors
gem.Jeśli potrzebujesz argumentów jako skrótu i nie chcesz zanieczyszczać treści metody trudnym wyodrębnianiem parametrów, użyj tego:
Po prostu dodaj tę klasę do swojego projektu:
źródło
Jeśli funkcja znajduje się wewnątrz jakiejś klasy, możesz zrobić coś takiego:
źródło