Насколько я знаю, нет простого или понятного способа получить имя аргумента из его значения. (См. В нижней части ответа один из способов сделать это следующим образом.)
Вместо этого, вот способ, которым я бы это сделал, который я считаю приятным и читабельным:
def who_is_bigger(a,b,c)
values = {a: a, b: b, c: c}
largest_key, _ = values.max_by { |key, value| value }
"#{largest_key} is bigger"
end
Это работает следующим образом:
- Построить ха sh из аргументов и сохранить его в
values
. Например, это га sh может быть { a: 84, b: 42, c: 21 }
. Найти наибольшее значение в этом га sh, используя метод Enumerable#max_by
. Это сохранит массив из 2 элементов в largest_pair
, например, [:a, 84]
. Обратите внимание, что ключ, который нам нужен, является первым элементом, поэтому мы используем деструктуризацию, чтобы извлечь первый элемент из этой пары и сохранить его в largest_key
.
. Построить строку и вернуть ее из метод.
Если вы хотите сделать это таким образом, чтобы вы динамически обращались к именам и значениям параметров и итерировали их, вы можете использовать это:
def who_is_bigger(a,b,c)
params = method(__method__).parameters
values = params.map { |_, name| [name, binding.local_variable_get(name)] }.to_h
largest_key, _ = values.max_by { |key, value| value }
"#{largest_key} is bigger"
end
Хотя, на мой взгляд, это выглядит немного странно и труднее для чтения, чем другое решение.