Saya mengerti konsep some_instance.send
tapi saya mencoba mencari tahu mengapa Anda bisa menyebut ini dua arah. Ruby Koans menyiratkan bahwa ada beberapa alasan selain memberikan banyak cara berbeda untuk melakukan hal yang sama. Berikut adalah dua contoh penggunaan:
class Foo
def bar?
true
end
end
foo = Foo.new
foo.send(:bar?)
foo.__send__(:bar?)
Adakah yang tahu tentang ini?
__send__
, tidaksend
.public_send
, yang seringkali lebih disukai daripada apa punsend
.Jika Anda benar - benar perlu
send
bersikap seperti biasanya, Anda harus menggunakan__send__
, karena itu tidak akan (seharusnya tidak) diganti. Menggunakan__send__
sangat berguna dalam metaprogramming, ketika Anda tidak tahu metode apa yang didefinisikan oleh kelas yang dimanipulasi. Itu bisa saja ditimpasend
.Menonton:
Jika Anda menimpa
__send__
, Ruby akan memancarkan peringatan:Beberapa kasus di mana akan berguna untuk menimpa
send
adalah di mana nama itu sesuai, seperti pesan yang lewat, kelas soket, dll.sumber
__send__
ada sehingga tidak dapat ditulis ulang secara tidak sengaja.Adapun mengapa
send
ada: Saya tidak bisa berbicara untuk orang lain, tetapiobject.send(:method_name, *parameters)
terlihat lebih baik daripadaobject.__send__(:method_name, *parameters)
, jadi saya gunakansend
kecuali saya perlu menggunakannya__send__
.sumber
Terlepas dari apa yang orang lain katakan kepada Anda, dan apa yang akhirnya mengatakan itu
send
dan__send__
dua alias dari metode yang sama, Anda mungkin tertarik pada yang ketiga, kemungkinan yang agak berbeda, yaitupublic_send
. Contoh:Pembaruan: Sejak Ruby 2.1,
Module#include
danModule#extend
metode menjadi publik, jadi contoh di atas tidak akan berfungsi lagi.sumber
Perbedaan utama antara kirim
__send__
,, dan public_send adalah sebagai berikut.__send__
secara teknis sama dengan yang digunakan untuk memanggil metode Object, tetapi perbedaan utamanya adalah Anda dapat mengganti metode pengiriman tanpa peringatan apa pun dan ketika Anda menimpa__send__
maka ada pesan peringatanIni karena untuk menghindari konflik, khususnya di permata atau perpustakaan ketika konteks di mana itu akan digunakan tidak diketahui, selalu gunakan
__send__
alih-alih mengirim.__send__
) dan public_send adalah bahwa send /__send__
dapat memanggil metode pribadi suatu objek, dan public_send tidak bisa.Pada akhirnya cobalah untuk menggunakan public_send untuk menghindari panggilan langsung ke metode pribadi alih-alih menggunakan __send__ atau mengirim.
sumber