Понимание [ClassOne, ClassTwo].each(&: my_method)

Возможный дубликат:
Что означает map (&: name) в Ruby?

Я смотрел railscast и видел этот код.

[Category, Product].(&:delete_all)

Что касается очистки базы данных.

Я спросил о линии в IRC и сказал

(&:delete_all)

был ярлыком для

{|model| model.delete_all}

Я проверил это со следующим

class ClassOne
  def class_method
    puts 1
  end
end

class ClassTwo
  def class_method
    puts 2
  end
end

[ClassOne, ClassTwo].each(&:class_method)

Я получил сообщение об ошибке

Wrong Argument type Symbol (expected Proc)

Я также пробовал

one = ClassOne.new
two = ClassTwo.new

[one, two].each(&:class_method)

Но это все еще не удалось.

Если я изменил его, прочитав

[one, two].each{|model| model.class_method}

Все работало, как ожидалось.

Итак, что делает &:delete_all на самом деле? Документы говорят, что delete_all - это метод, поэтому я смущен относительно того, что здесь происходит.

Ответ 1

Это зависит от расширения Ruby 1.9, которое можно сделать в 1.8, включив следующее:

class Symbol
    def to_proc
      proc { |obj, *args| obj.send(self, *args) }
    end
end

Я считаю, что Rails определяет это в ActiveSupport.

Ответ 2

Это некоторые Rails-специфические исправления Ruby, символ для proc.