Есть ли способ узнать, сколько параметров требуется для метода?

Используя 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