2013-05-17 12 views
7

Tak, właśnie dowiedziałem się, że zamiast pisać takie rzeczy jak:Ruby próbuje uchwycić nową notację. (Wstrzyknąć (:) vs wybrać (&: nawet); dlaczego trzeba i?)

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

mógłbym napisać

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

dowiedziałem się też, że zamiast pisać

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

mógłbym napisać

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

Moje pytanie brzmi: dlaczego jeden (wybierz) używa &, a drugi (wstrzykiwanie) nie. Jestem pewien, że : są, ponieważ even? i + są traktowane na symbole, ale chciałbym wyjaśnić, dlaczego & jest używany w jednym i dlaczego : są używane.

Ponadto zdaję sobie sprawę z tego, że mogłem wykonać te zapisy na więcej niż tylko inject i select.

Wielkie dzięki!

Odpowiedz

10

& Operator w tym przypadku konwertuje symbol do proc. Więc kod robi to pod maską:

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

Realizacja inject metoda uznaje potrzebę tych specyfikacji metody skrót i dodaje specjalnego trybu postępowania, gdy symbol jest przechodzi jako parametr. Tak więc w tym przypadku robi to, co robi operator &.

dlaczego jeden (wybierz) używa & a drugi (wstrzyknąć) nie

robi Ponieważ nikt realizowane select ten sposób. Ruby jest open-source, mogą nawet zaakceptować twój patch. Idź i napraw to :)

P.S .: Ale jeśli to zależałoby ode mnie, to zamiast tego usunie specjalne traktowanie przez wstrzyknięcie. Czuje się trochę zbędny i mylący w obecności Symbol#to_proc (to właśnie używa operator &).

+0

Rozumiem. Bardzo, bardzo interesujące! W Ruby odkryłem, że wiele rzeczy jest bardzo prostych do wykonania, tak jak zrobiłem to z moim wyborem. Poszliście naprzód i napisaliście '{| elem | elem.send: even?} 'Czy to w istocie to, co robi mój blok w tle? Zmieniając się w ten format, a następnie wykonując jakiekolwiek obliczenia, które ma wykonywać? Tak wiele różnych sposobów robienia rzeczy w Ruby. Jestem ciekawy. – David

+0

@David: tak, to właśnie 'select (&: even?)' Ma pod maską. –

+1

@ David nie zapomnij przyjąć odpowiedzi, jeśli rzeczywiście odpowiada na pytanie! – vgoff

Powiązane problemy