2016-06-30 10 views
0

Wie wird die & in Schienen verwendet, wenn mit Arrays, Sammlungen oder ActiveRecord-Abfragen gearbeitet wird? Bitte geben Sie Beispiele und wie es funktioniert.Wie funktioniert und arbeitet in Schienen?

Bis jetzt habe ich Implementierungen mit gemeinsamen Arrays gesehen, kann aber nicht verstehen, wie es funktioniert. Unten ist ein einfaches Beispiel, bitte benutzen Sie dies, um Ihre Antwort zu illustrieren.

array = [1, 2, 3, 4] 

array.each do |number| 
number + 2 
end 
+0

Aus Ihrer Frage ist unklar, welche Verwendung von '&' Sie suchen. '&' wird als Set-Kreuzungsoperator auf Array (http://ruby-doc.org/core-2.0/Array.html#method-i-26) implementiert, ist aber auch ein Alias ​​für 'to_proc' auf Symbol (http://ruby-doc.org/core-2.0.0/Symbol.html#method-i-to_proc) und wird oft verwendet, um kurze Collection-Iteratoren zu schreiben. – Jonah

Antwort

1

Wenn Ruby ein & vor einem Objekt trifft, es erwartet sie ein Proc sein, so dass es to_proc auf diesem Objekt nennen würde.

So zum Beispiel, wenn Sie hatte

proc_object = proc{puts 1} 

Passing &proc_object als Argument für eine Methode, die einen Block akzeptiert würde to_proc auf das Objekt aufrufen.

Dies ist der gleiche Fall mit einem Symbol :proc_object, als ein Anruf an &:method_name ist das gleiche wie :method_name.to_proc.call tun.

In einem Enumerable werden dem Proc Objekte übergeben, deshalb können Sie ein Array-Objekt durchlaufen und jedes Element drucken, da jedes dieser Elemente während der Schleife zurückgegeben wird.

Für jedes Element in der Sammlung wird das proc auf sich als solche

[1,2,4,5].map(&:to_s) # => ['1', '2', '4', '5'] 

nennen diese grundsätzlich jedes Element des Arrays ein String-Objekt umgewandelt, weil jedes Element des Arrays zu meinem proc ergibt.

sollten Sie sehen die &: to_s innerhalb Elements Kontext zB ausgeführt 5.to_s, da das Verfahren existiert bereits innerhalb Elements der Klasse usw.

Wenn Sie das Gleiche mit einem Verfahren zu erreichen versuchen, die nicht auf jedem definiert Element, erhalten Sie einen undefined_method Fehler.

In Ihrem Fall glaube ich nicht, dass es ein gutes Beispiel wäre, es sei denn, eine add_two Methode existierte.

Beispiele:

{dave: :fogo, stack: :overflow, day: :today}.map(&:first) # => would return :dave, :stack, :day because for each loop through the map, an array is yielded with the first element being the key and the second the value. 

[1,2,3,5,10].map(&:even?) # => [false, true, false, false, true] 

Das Array und Hash ist ähnlich wie Active ist, ist eine Sache zu wissen, dass die Methode Sie vorbei gefahren ist, innerhalb der Klasse des Elements definiert werden.

Ich hoffe, das macht Sinn.