Mengapa? Karena angka tidak memiliki metode bawaan add_one. Jadi, Anda akan mendapatkan NoMethodError.
Jadi, alih-alih hanya memberikan nama metode,:add_one Anda dapat melewati metode terikatmethod(:add_one) :
nums.map(&method(:add_one))
Sekarang, alih-alih setiap angka digunakan sebagai penerima untuk add_onemetode, mereka akan digunakan sebagai argumen . Jadi, pada dasarnya sama dengan:
nums.map do|num|
add_one(num)end
Untuk memberikan contoh lain, bandingkan yang berikut:
[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#methodmengembalikan sebuah batasanMethod , bukan sebuah UnboundMethod. Metode ini terikat ke penerima karena Anda memanggilnya pada contoh dan dengan demikian tahu apa selfitu, sedangkan Module#instance_methodmengembalikan UnboundMethodkarena tidak bisa tahu apa yang akan digunakan dengan contoh itu.
Jörg W Mittag
@ JörgWMittag Ok terima kasih atas koreksinya, Anda benar saya pasti mencampurnya dengan .instance_methodkarena saya baru saja mengingat (cacat) memori
maks pleaner
10
method(:function)adalah pengiriman pesan (kadang-kadang disebut pemanggilan metode ) ke penerima implisit (yaitu self). Itu mengirim pesan methodke penerima implisit (yaitu self), lewat :functionsebagai satu-satunya argumen.
:functionadalah Symbolliteral, yaitu notasi literal dari a Symbol. Symboladalah tipe data yang mewakili "nama sesuatu".
The awers ampers uners dan &operator "membuka gulungan" a Procke dalam blok . Yaitu memungkinkan Anda untuk melewati di Procmana blok diharapkan. Jika objek belum menjadi Proc, maka akan dikirim to_procpesan yang memungkinkannya untuk mengubah dirinya menjadi a Proc. (Operator hanya sah dalam daftar argumen dan hanya untuk argumen terakhir. Ini adalah ganda dari& sigil dalam daftar parameter, yang "menggulung" blok ke Procobjek.)
Procadalah tipe data yang mewakili kode yang dapat dieksekusi. Ini adalah kelas inti perpustakaan Ruby untuk subrutin kelas satu.
Jadi, apa yang dilakukan, adalah memanggil methodmetode selfdengan :functionsebagai argumen, memanggil to_procnilai kembali, "membuka gulungan" Procobjek yang dihasilkan ke dalam blok dan meneruskan blok itu ke panggilan untuk integrateseolah-olah Anda telah menulis sesuatu seperti
res = integrate(0,1, a)do# somethingend
The methodMetode sini adalah kemungkinan besar, Object#methodmetode, yang mengembalikan terikatMethod objek.
Jadi, secara keseluruhan, ini agak setara dengan
res = integrate(0,1, a)do|*args,&block|
function(*args,&block)end
Namun diekspresikan dalam apa yang biasa disebut gaya pointfree .
Jawaban:
Katakanlah kita punya metode
dan berbagai string
Kami ingin
map
daftar string untuk output yang sesuai dariadd_one
.Untuk memulai kita bisa menelepon
Ini sama dengan
Anda dapat melihat Apa artinya peta (&: nama) di Ruby? untuk info lebih lanjut tentang ini.
Namun, itu tidak berfungsi untuk memanggil:
Mengapa? Karena angka tidak memiliki metode bawaan
add_one
. Jadi, Anda akan mendapatkanNoMethodError
.Jadi, alih-alih hanya memberikan nama metode,
:add_one
Anda dapat melewati metode terikatmethod(:add_one)
:Sekarang, alih-alih setiap angka digunakan sebagai penerima untuk
add_one
metode, mereka akan digunakan sebagai argumen . Jadi, pada dasarnya sama dengan:Untuk memberikan contoh lain, bandingkan yang berikut:
sumber
Object#method
mengembalikan sebuah batasanMethod
, bukan sebuahUnboundMethod
. Metode ini terikat ke penerima karena Anda memanggilnya pada contoh dan dengan demikian tahu apaself
itu, sedangkanModule#instance_method
mengembalikanUnboundMethod
karena tidak bisa tahu apa yang akan digunakan dengan contoh itu..instance_method
karena saya baru saja mengingat (cacat) memorimethod(:function)
adalah pengiriman pesan (kadang-kadang disebut pemanggilan metode ) ke penerima implisit (yaituself
). Itu mengirim pesanmethod
ke penerima implisit (yaituself
), lewat:function
sebagai satu-satunya argumen.:function
adalahSymbol
literal, yaitu notasi literal dari aSymbol
.Symbol
adalah tipe data yang mewakili "nama sesuatu".The awers ampers uners dan
&
operator "membuka gulungan" aProc
ke dalam blok . Yaitu memungkinkan Anda untuk melewati diProc
mana blok diharapkan. Jika objek belum menjadiProc
, maka akan dikirimto_proc
pesan yang memungkinkannya untuk mengubah dirinya menjadi aProc
. (Operator hanya sah dalam daftar argumen dan hanya untuk argumen terakhir. Ini adalah ganda dari&
sigil dalam daftar parameter, yang "menggulung" blok keProc
objek.)Proc
adalah tipe data yang mewakili kode yang dapat dieksekusi. Ini adalah kelas inti perpustakaan Ruby untuk subrutin kelas satu.Jadi, apa yang dilakukan, adalah memanggil
method
metodeself
dengan:function
sebagai argumen, memanggilto_proc
nilai kembali, "membuka gulungan"Proc
objek yang dihasilkan ke dalam blok dan meneruskan blok itu ke panggilan untukintegrate
seolah-olah Anda telah menulis sesuatu sepertiThe
method
Metode sini adalah kemungkinan besar,Object#method
metode, yang mengembalikan terikatMethod
objek.Jadi, secara keseluruhan, ini agak setara dengan
Namun diekspresikan dalam apa yang biasa disebut gaya pointfree .
sumber