2013-05-17 8 views
7

So habe ich gelernt, nur dass statt des Schreibens Dinge wie:Ruby versucht eine neue Notation zu erfassen. (Injizieren (:) vs wählen (&: gerade), warum hat man &?)

[1,2,3,4,5].inject {|x,y| x + y} => 15 

konnte ich schreiben

[1,2,3,4,5].inject(:+) => 15 

ich habe auch gelernt, dass anstelle von

[1,2,3,4,5].select {|x| x.even?} => [2,4] 

schreiben I

[1,2,3,4,5].select(&:even?) => [2,4] 
schreiben konnte

Meine Frage ist, warum man (wählen) & verwendet und das andere (inject) nicht. Ich bin sicher, dass die : sind, weil even? und + sind bei Symbolen behandelt, aber ich würde gerne klären, warum die & in einem verwendet wird und warum die : verwendet werden.

Auch ich bin mir bewusst, dass ich diese Notationen auf mehr als nur inject und select tun konnte.

Vielen Dank!

Antwort

10

& Operator in diesem Fall konvertiert ein Symbol in ein Proc. Das Gleiche gilt für den Code dies unter der Haube:

[1,2,3,4,5].select {|elem| elem.send :even? } # => [2, 4] 

Implementierung von inject Verfahren die Notwendigkeit für diese Verknüpfung Methode Spezifikation erkennen und fügen eine spezielle Behandlung für Symbol als Parameter übergibt. Also, in diesem Fall tut es im Grunde, was & Betreiber tut.

warum ein (Auswahl), die & und der andere verwendet (injizieren) nicht

Weil niemand select diese Art und Weise umgesetzt. Ruby ist Open-Source, sie können sogar Ihren Patch akzeptieren. Geh und repariere das :)

S.S .: Aber wenn es an mir liegen würde, würde ich stattdessen entfernen inject's spezielle Handhabung. Es fühlt sich ein wenig redundant und verwirrend in Anwesenheit von Symbol#to_proc (das ist, was & Betreiber verwendet).

+0

Ich sehe. Sehr, sehr interessant! In Ruby finde ich, dass viele Dinge sehr einfach zu tun sind, so wie ich es bei meiner Auswahl getan habe. Sie gingen vorwärts und schrieben '{| elem | elem.send: even?} 'Ist das im Kern das, was mein Block im Hintergrund macht? Sich in dieses Format umwandeln und dann tun, was immer es sein soll? So viele verschiedene Möglichkeiten, Dinge in Ruby zu tun. Ich bin neugierig. – David

+0

@David: Ja, das ist was 'select (&: even?)' Unter der Haube tut. –

+1

@David vergessen Sie nicht, die Antwort zu akzeptieren, wenn es tatsächlich die Frage beantwortet! – vgoff