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

Possible Duplicate:
What does map(&:name) mean in Ruby?

Я смотрел телепередачу и увидел этот код.

[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 - это метод, поэтому я не понимаю, что здесь происходит.

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
12
0
3 413
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

Это верно; если вы запустили свой тест в irb, это не сработает (при условии, что вы используете Ruby 1.8.x). Попробуйте еще раз в скрипте / консоли.

Ben Scofield 19.09.2008 16:00

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

Раньше этот ответ был правдой, но сейчас Ruby 1.8.6 и более ранние версии действительно унаследованы.

Andrew Grimm 21.11.2011 06:27

Другие вопросы по теме