ruby - tutorial - Comprendere




ruby version (2)

Possibile duplicato:
Cosa significa map (&: name) in Ruby?

Stavo guardando un railscast e ho visto questo codice.

[Category, Product].(&:delete_all)

Per quanto riguarda la cancellazione di un database.

Ho chiesto informazioni sulla linea in IRC e mi è stato detto

(&:delete_all)

era una scorciatoia per

{|model| model.delete_all}

Ho provato questo con il seguente

class ClassOne
  def class_method
    puts 1
  end
end

class ClassTwo
  def class_method
    puts 2
  end
end

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

Ho ricevuto un errore che diceva

Wrong Argument type Symbol (expected Proc)

Ho anche provato

one = ClassOne.new
two = ClassTwo.new

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

Ma quello ancora fallì.

Se l'ho modificato da leggere

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

Tutto ha funzionato come previsto.

Quindi, che cosa fa &:delete_all effettivamente? I documenti dicono che delete_all è un metodo, quindi sono confuso su cosa sta succedendo qui.



Questo si basa su un'estensione di Ruby 1.9 che può essere eseguita in 1.8 includendo quanto segue:

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

Credo che Rails lo definisca in ActiveSupport .







ruby