Подтвердить что ты не робот

Как передать функцию вместо блока

Возможный дубликат:
Более короткий способ передачи каждого элемента массива в функцию

Я знаю, что это сработает:

def inc(a)
  a+1
end
[1,2,3].map{|a| inc a}

но в Python мне просто нужно написать:

map(inc, [1,2,3])

или

[inc(x) for x in [1,2,3])

Мне было интересно, могу ли я пропустить шаги создания блока в Ruby и сделал следующее:

[1,2,3].map inc
# => ArgumentError: wrong number of arguments (0 for 1)
# from (irb):19:in `inc'

Есть ли у кого-нибудь идеи о том, как это сделать?

4b9b3361

Ответ 1

В соответствии с "Передача методов, таких как блоки в Ruby", вы можете передать метод в виде блока следующим образом:

p [1,2,3].map(&method(:inc))

Не знаю, намного ли лучше, чем катить свой блок, честно.

Если ваш метод определен в классе объектов, которые вы используете, вы можете сделать это:

# Adding inc to the Integer class in order to relate to the original post.
class Integer
  def inc
    self + 1
  end
end

p [1,2,3].map(&:inc)

В этом случае Ruby интерпретирует символ как имя метода экземпляра и пытается вызвать метод для этого объекта.


Причина, по которой вы можете передать имя функции как объект первого класса в Python, но не в Ruby, заключается в том, что Ruby позволяет вызывать метод с нулевыми аргументами без круглых скобок. Python, поскольку она требует скобок, предотвращает любую возможную двусмысленность между передачей имени функции и вызовом функции без аргументов.

Ответ 2

Не отвечает на ваш вопрос, но если вы действительно хотите увеличить все свои переменные, вы Integer#next

4.next
#=> 5

[1,2,3].map(&:next)
#=> [2, 3, 4]

Ответ 3

def inc(a)
  a + 1 
end

p [1,2,3].map{|a| inc a}