Есть ли способ узнать, сколько параметров требуется для метода?
Используя irb
, мы можем перечислить методы для конкретного объекта, выполнив следующие действия:
"Name".methods
Но если я хочу знать, сколько параметров необходимо для конкретного метода, как я могу это достичь? Я имею в виду, есть ли какой-либо способ (путем нажатия какой-либо команды на irb), мы можем получить количество параметров для конкретного метода (вместо обращения к документам)?
.methods
возвращает только имена методов, а не список параметров для метода.
Ответы
Ответ 1
Вы можете использовать метод Method#arity
:
"string".method(:strip).arity
# => 0
Из документации Ruby:
Возвращает указание количества аргументов, принятых методом. Возвращает неотрицательное целое число для методов, принимающих фиксированное число аргументы. Для методов Ruby, которые принимают переменное количество аргументов, возвращает -n-1, где n - количество требуемых аргументов. Для методов написанная на C, возвращает -1, если вызов принимает переменное число Аргументы.
Итак, например:
# Variable number of arguments, one is required
def foo(a, *b); end
method(:foo).arity
# => -2
# Variable number of arguments, none required
def bar(*a); end
method(:bar).arity
# => -1
# Accepts no argument, implemented in C
"0".method(:to_f).arity
# => 0
# Variable number of arguments (0 or 1), implemented in C
"0".method(:to_i).arity
# => -1
Обновление Я только что обнаружил выход Method#parameters
, это может быть весьма полезно:
def foo(a, *b); end
method(:foo).parameters
# => [[:req, :a], [:rest, :b]]
Ответ 2
Вы можете использовать arity
Возвращает указание количества аргументов, принятых методом. Возвращает неотрицательное целое число для методов, принимающих фиксированное число аргументов. Для методов Ruby, которые принимают переменное количество аргументов, возвращает -n-1, где n - количество требуемых аргументов. Для методов, написанных на C, возвращается -1, если вызов принимает переменное количество аргументов.
Пример из ruby-doc
class C
def one; end
def two(a); end
def three(*a); end
def four(a, b); end
def five(a, b, *c); end
def six(a, b, *c, &d); end
end
c = C.new
c.method(:one).arity #=> 0
c.method(:two).arity #=> 1
c.method(:three).arity #=> -1
c.method(:four).arity #=> 2
c.method(:five).arity #=> -3
c.method(:six).arity #=> -3