2012-02-24 13 views
25

Powiel możliwe:
What does map(&:name) mean in Ruby?jaka jest funkcjonalność operatora "&:" w ruby?

natknąłem się na fragment kodu, który miał następujące

a.each_slice(2).map(&:reverse) 

nie wiem funkcjonalność &: operatora. Jak to działa?

+0

To jest duplikatem nie mniej niż 17 innych pytań, które zostały już zadane i odpowiedzi tutaj na StackOverflow: [Zrozumienie \ [ClassOne , ClassTwo \] .each \ (&: my_method \)] (http://StackOverflow.Com/q/99318/), [Co znaczy "map (&: name)" w Ruby?] (Http: // StackOverflow.Com/q/1217088/), [Czym dokładnie jest 'i: capitalize' w Ruby?] (Http://StackOverflow.Com/q/1792683/), [Ruby/Ruby na Railsach i skrócie dwukropka] (http : //StackOverflow.Com/q/1961030/), [Ruby: '&: symbol' syntax] (http://StackOverflow.Com/q/2096975/), ... –

+0

... [Co to jest '&: last' Ruby Construct Called?] (Http://StackOverflow.Com/q/2211751/), [Co nazywasz operatorem' &: 'w Rubim?] (Http: // /StackOverflow.Com/q/2259775/), [Do czego służy 'map (&: name)' w tym kodzie Ruby?] (Http://StackOverflow.Com/q/2388337/), [Czym są ': + 'i' & + 'w ruby?] (http://StackOverflow.Com/q/2697024/), [' &: views_count' w 'Post.published.collect (&: views_count)'] (http: // StackOverflow.Com/q/3888044/), [Ruby Proc Syntax] (http://StackOverflow.Com/q/4512587/), [W jaki sposób "' (1..4) .inject (&: +) '" praca w Rubim] (http://StackOverflow.Com/q/5003257/), ... –

+0

... [Co robi następujące zdanie '&: property'?] (http://StackOverflow.Com/q/5620411/), [ Co oznacza '&' w następującej składni ruby?] (Http://StackOverflow.Com/q/5952175/), [Dlaczego ktoś użyłby operatora unarnego dla właściwości ruby? tj. '&: first'] (http://StackOverflow.Com/q/6289084/), [w jaki sposób' Array # map' ma parametr do zrobienia czegoś takiego?] (http://StackOverflow.Com/q/ 6716629 /) i [co oznacza '&:' w rubinie, czy jest to blok zmieszany z symbolem?] (Http://StackOverflow.Com/q/9188362/). –

Odpowiedz

60

W Ruby nie ma operatora &:. To, co widzisz, to operator & zastosowany do :symbol.

Na liście Sposób argumentu operator & ma swój argument, konwertuje go w Proc obiektu, jeśli jeszcze nie jest (poprzez wywołanie to_proc na nim) i przekazuje go do sposobu jak blok zostały wykorzystane.

my_proc = Proc.new { puts "foo" } 

my_method_call(&my_proc) # is identical to: 
my_method_call { puts "foo" } 

Pytanie więc teraz staje się „Co Symbol#to_proc zrobić?”, A to łatwo zrozumieć, w the Rails documentation:

Okazuje symbol w prosty proc, co jest szczególnie przydatne dla wyliczeń. Przykłady:

# The same as people.collect { |p| p.name } 
people.collect(&:name) 

# The same as people.select { |p| p.manager? }.collect { |p| p.salary } 
people.select(&:manager?).collect(&:salary) 
+3

Sugerujesz to, ale lepiej byłoby powiedzieć jednoznacznie: jest to modyfikacja, którą robi Rails, i nie jest wbudowana w samą Ruby. – kikito

+5

@kikito: http://ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc – tokland

+0

Masz rację - właśnie wypróbowałem to w zwykłym irb (1.8.7), to jest w samej Ruby. Ten nie jest dostarczany przez Rails. Dzięki za poprawienie mojego błędu! – kikito

18

przez poprzedzenie & do symbolu tworzysz funkcję lambda, która będzie wywołać metodę z nazwą tego symbolu na obiekt, który przenikał do tej funkcji. Biorąc to pod uwagę:

ar.map(&:reverse) 

jest grubsza odpowiada:

ar.map { |element| element.reverse } 
+2

Proszę nie odpowiadać na zduplikowane pytania. Po prostu zagłosuj, aby zamknąć. To pytanie zostało już zadane i udzielono odpowiedzi 17 (!!!) razy, tak naprawdę * nic * zyskało, rozszerzając wiedzę jeszcze bardziej. –

+10

Widziałem pytanie i odpowiedziałem. Został oznaczony jako duplikat dopiero po tym. –

Powiązane problemy