Dlaczego? Ponieważ liczby nie mają wbudowanej metody add_one. Więc dostaniesz NoMethodError.
Zamiast podawać tylko nazwę metody:add_one , możesz przekazać powiązaną metodęmethod(:add_one) :
nums.map(&method(:add_one))
Teraz, zamiast każdego num używany jako odbiornik dla add_onesposobu, będą one używane jako argumenty . Jest to zasadniczo to samo, co:
nums.map do|num|
add_one(num)end
Aby podać inny przykład, porównaj następujące:
[1].map(&:puts)# this is the same as [1].map { |num| num.puts }# it raises NoMethodError[1].map(&method(:puts))# this is the same as [1].map { |num| puts num }# it prints 1 successfully
Nitpick: Object#methodzwraca powiązaneMethod , a nie an UnboundMethod. Metoda jest powiązana z odbiornikiem, ponieważ wywołujesz ją w instancji, a zatem wie, co selfjest, podczas gdy Module#instance_methodzwraca a, UnboundMethodponieważ nie może wiedzieć, z którą instancją będzie używana.
Jörg W Mittag
@ JörgWMittag Ok, dziękuję za korektę, masz rację. Musiałem się z tym mieszać, .instance_methodponieważ właśnie przechodziłem przez (wadliwą) pamięć
max pleaner
10
method(:function)to wiadomość wysyłana (czasami nazywana wywołaniem metody ) do niejawnego odbiorcy (tj self.). Wysyła wiadomość methoddo niejawnego odbiorcy (tjself ), Przekazując :functionjako jedyny argument.
:function jest Symbol dosłowne, tzn. jest dosłowne oznaczenie Symbol. Symbolto typ danych reprezentujący „nazwę czegoś”.
Jednoargumentowy znak ampersand &operator „rozwija” a Procdo bloku . To znaczy, że możesz przejść tam, Procgdzie oczekiwany jest blok . Jeśli obiekt nie jest już a Proc, zostanie wysłany to_prockomunikat umożliwiający jego konwersję na Proc. (Operator jest dozwolony tylko na liście argumentów i tylko dla ostatniego argumentu. Jest podwójny z& podwójność sigil na liście parametrów, która „zwija” blok w Procobiekt.)
Procjest typem danych reprezentującym kod wykonywalny. Jest to podstawowa klasa biblioteki Ruby dla podprogramów pierwszej klasy.
To, co to robi, to wywołanie methodmetody selfz :functionargumentem, wywołanie to_procwartości zwracanej, „rozwinięcie” wynikowego Procobiektu do bloku i przekazanie tego bloku do wywołania integratetak, jakbyś napisał coś w rodzaju
res = integrate(0,1, a)do# somethingend
methodMetoda jest tu najprawdopodobniej, Object#methodmetoda, która zwraca boundMethod obiektu.
Podsumowując, jest to nieco równoważne
res = integrate(0,1, a)do|*args,&block|
function(*args,&block)end
Odpowiedzi:
Powiedzmy, że mamy metodę
i tablica ciągów
Chcemy
map
listę ciągów odpowiadających im danych wyjściowychadd_one
.Na początek możemy zadzwonić
To jest to samo co
Możesz zobaczyć Co oznacza mapa (i: nazwa) w Ruby? po więcej informacji na ten temat.
Jednak nie zadzwoni:
Dlaczego? Ponieważ liczby nie mają wbudowanej metody
add_one
. Więc dostanieszNoMethodError
.Zamiast podawać tylko nazwę metody
:add_one
, możesz przekazać powiązaną metodęmethod(:add_one)
:Teraz, zamiast każdego num używany jako odbiornik dla
add_one
sposobu, będą one używane jako argumenty . Jest to zasadniczo to samo, co:Aby podać inny przykład, porównaj następujące:
źródło
Object#method
zwraca powiązaneMethod
, a nie anUnboundMethod
. Metoda jest powiązana z odbiornikiem, ponieważ wywołujesz ją w instancji, a zatem wie, coself
jest, podczas gdyModule#instance_method
zwraca a,UnboundMethod
ponieważ nie może wiedzieć, z którą instancją będzie używana..instance_method
ponieważ właśnie przechodziłem przez (wadliwą) pamięćmethod(:function)
to wiadomość wysyłana (czasami nazywana wywołaniem metody ) do niejawnego odbiorcy (tjself
.). Wysyła wiadomośćmethod
do niejawnego odbiorcy (tjself
), Przekazując:function
jako jedyny argument.:function
jestSymbol
dosłowne, tzn. jest dosłowne oznaczenieSymbol
.Symbol
to typ danych reprezentujący „nazwę czegoś”.Jednoargumentowy znak ampersand
&
operator „rozwija” aProc
do bloku . To znaczy, że możesz przejść tam,Proc
gdzie oczekiwany jest blok . Jeśli obiekt nie jest już aProc
, zostanie wysłanyto_proc
komunikat umożliwiający jego konwersję naProc
. (Operator jest dozwolony tylko na liście argumentów i tylko dla ostatniego argumentu. Jest podwójny z&
podwójność sigil na liście parametrów, która „zwija” blok wProc
obiekt.)Proc
jest typem danych reprezentującym kod wykonywalny. Jest to podstawowa klasa biblioteki Ruby dla podprogramów pierwszej klasy.To, co to robi, to wywołanie
method
metodyself
z:function
argumentem, wywołanieto_proc
wartości zwracanej, „rozwinięcie” wynikowegoProc
obiektu do bloku i przekazanie tego bloku do wywołaniaintegrate
tak, jakbyś napisał coś w rodzajumethod
Metoda jest tu najprawdopodobniej,Object#method
metoda, która zwraca boundMethod
obiektu.Podsumowując, jest to nieco równoważne
Ale wyrażone w tak zwanym stylu bez punktów .
źródło