Как стать автором
Обновить
0
0
Алексей Сорокин @alsor

Пользователь

Отправить сообщение
Сорри, забыл написать, что «a» это массив, что-то типа вот такого:
a = [User.new("Jack"), User.new("Bob")]


и тогда на выходе у нас:
["Dear Mr. Jack!", "Dear Mr. Bob!"]
На самом деле магия еще интереснее — здесь мы не ограничены передачей методов без параметров. При помощи &: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, значит не надо завязываться на тип или имя этого поля или вообще учитывать его существование — и твоя программа будет устойчива. А компилятор тебе в этом поможет. Ну а если уж решил таки что-то с этим полем сделать — вот тебе способ.

Информация

В рейтинге
Не участвует
Откуда
Россия
Дата рождения
Зарегистрирован