Новичок в Ruby и ROR, и мне он нравится каждый день, поэтому вот мой вопрос, так как я не знаю, как его использовать в Google (и я пробовал :))
у нас есть метод
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
Итак, я ищу способ передать все аргументы методу, не перечисляя каждый из них. Поскольку это Ruby, я предполагаю, что есть способ :) если бы это была java, я бы просто перечислил их :)
Результат будет:
Method has failed, here are all method arguments {"Mario", "Super", 40, true, true}
ruby-on-rails
ruby
Харис Краина
источник
источник
method(__method__).parameters.map { |_, v| [v, binding.local_variable_get(v)] }
Ответы:
В Ruby 1.9.2 и более поздних версиях вы можете использовать
parameters
метод для метода, чтобы получить список параметров этого метода. Это вернет список пар с указанием имени параметра и того, требуется ли он.например
Если вы это сделаете
затем
Вы можете использовать специальную переменную,
__method__
чтобы получить имя текущего метода. Итак, внутри метода имена его параметров можно получить черезЗатем вы можете отобразить имя и значение каждого параметра с помощью
Примечание: поскольку этот ответ был изначально написан, в текущих версиях Ruby
eval
больше нельзя вызывать с помощью символа. Для решения этой проблемыto_s
было добавлено явное при построении списка имен параметров, т.е.parameters.map { |arg| arg[1].to_s }
источник
Начиная с Ruby 2.1, вы можете использовать binding.local_variable_get для чтения значения любой локальной переменной, включая параметры метода (аргументы). Благодаря этому вы можете улучшить принятый ответ, чтобы избежать
злойeval.источник
Hash[method(__method__).parameters.map.collect { |_, name| [name, binding.local_variable_get(name)] }]
Один из способов справиться с этим:
источник
Это интересный вопрос. Может быть, используя local_variables ? Но должен быть другой способ, кроме использования eval. Я ищу в документе ядра
источник
eval var.to_s
. Кроме того, следует предупредить о том, что если вы определите какие-либо локальные переменные перед запуском этого цикла, они будут включены в дополнение к параметрам метода.local_variables
, он вернет аргументы метода + все локальные переменные. Это может вызвать ошибки, когда ваш код.Это может быть полезно ...
источник
callers_name
реализации, вы можете также пройти__method__
вместе сbinding
.Вы можете определить такую константу, как:
И используйте это в своем коде, например:
источник
Прежде чем я продолжу, вы передаете в foo слишком много аргументов. Похоже, что все эти аргументы являются атрибутами модели, верно? Вы действительно должны передать сам объект. Конец выступления.
Вы можете использовать аргумент "splat". Запихивает все в массив. Это выглядело бы так:
источник
Если вы хотите изменить подпись метода, вы можете сделать что-то вроде этого:
Или:
В этом случае интерполированный
args
илиopts.values
будет массивом, но вы можете,join
если через запятую. Ураисточник
Кажется, что то, что пытается решить этот вопрос, можно сделать с помощью только что выпущенного гема https://github.com/ericbeland/exception_details . Он перечислит локальные переменные и vlaues (и переменные экземпляра) из спасенных исключений. Стоит взглянуть ...
источник
better_errors
gem.Если вам нужны аргументы в виде хэша, и вы не хотите загрязнять тело метода сложным извлечением параметров, используйте это:
Просто добавьте этот класс в свой проект:
источник
Если функция находится внутри какого-то класса, вы можете сделать что-то вроде этого:
источник