На самом деле магия еще интереснее — здесь мы не ограничены передачей методов без параметров. При помощи &:symol можно передать метод принимающий любое количество аргументов.
Пусть у нас будет вот такой метод в массиве:
class Array
def map_with_arguments (*args)
a = []
self.each do |e|
a << yield(e, *args)
end
a
end
end
И вот такой метод в нашем юзере:
class User
def initialize (name); @name = name; end
def greeting (pre, suf)
"#{pre}#{@name}#{suf}"
end
end
Тогда вот это
a.map_with_arguments("Dear Mr. ", "!") {|el, pre, suf| el.greeting pre, suf}
можно написать вот так:
a.map_with_arguments("Dear Mr. ", "!", &:greeting)
На это можно взглянуть и с другой точки зрения — не все что написано в программе для машины, скорее это для другого человека. Если ты увидел private, значит не надо завязываться на тип или имя этого поля или вообще учитывать его существование — и твоя программа будет устойчива. А компилятор тебе в этом поможет. Ну а если уж решил таки что-то с этим полем сделать — вот тебе способ.
и тогда на выходе у нас:
Пусть у нас будет вот такой метод в массиве:
И вот такой метод в нашем юзере:
Тогда вот это
можно написать вот так: