Saya mungkin salah karena tidak ada yang menyebutkannya, tetapi saya juga mendapat kesan bahwa alasan untuk ini juga merupakan warisan rubi untuk dapat memanggil fungsi tanpa tanda kurung.
Arity jelas terlibat tetapi mari kita mengesampingkannya untuk sementara waktu dan menggunakan fungsi tanpa argumen. Dalam bahasa seperti javascript di mana tanda kurung adalah wajib, mudah untuk membuat perbedaan antara melewati fungsi sebagai argumen dan memanggil fungsi. Anda menyebutnya hanya saat Anda menggunakan tanda kurung.
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
Seperti yang Anda lihat, memberi nama atau tidak tidak membuat perbedaan besar. Tapi elixir dan ruby memungkinkan Anda untuk memanggil fungsi tanpa tanda kurung. Ini adalah pilihan desain yang saya pribadi suka tetapi memiliki efek samping ini Anda tidak dapat menggunakan nama saja tanpa tanda kurung karena itu bisa berarti Anda ingin memanggil fungsi. Ini untuk apa &
. Jika Anda meninggalkan appity arity sesaat, menambahkan nama fungsi Anda dengan &
berarti bahwa Anda secara eksplisit ingin menggunakan fungsi ini sebagai argumen, bukan apa fungsi ini mengembalikan.
Sekarang fungsi anonim sedikit berbeda karena sebagian besar digunakan sebagai argumen. Sekali lagi ini adalah pilihan desain tetapi rasional di balik itu adalah bahwa itu terutama digunakan oleh iterators jenis fungsi yang mengambil fungsi sebagai argumen. Jadi jelas Anda tidak perlu menggunakan &
karena mereka sudah dianggap sebagai argumen secara default. Itu tujuan mereka.
Sekarang masalah terakhir adalah bahwa kadang-kadang Anda harus memanggil mereka dalam kode Anda, karena mereka tidak selalu digunakan dengan jenis fungsi iterator, atau Anda mungkin membuat kode iterator sendiri. Untuk cerita kecil, karena ruby berorientasi objek, cara utama untuk melakukannya adalah menggunakan call
metode pada objek. Dengan begitu, Anda bisa menjaga perilaku kurung non-wajib konsisten.
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
Sekarang seseorang datang dengan jalan pintas yang pada dasarnya terlihat seperti metode tanpa nama.
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
Sekali lagi, ini adalah pilihan desain. Sekarang elixir tidak berorientasi objek dan karenanya panggilan tidak menggunakan bentuk pertama pasti. Saya tidak dapat berbicara untuk José tetapi sepertinya bentuk kedua digunakan di elixir karena masih terlihat seperti pemanggilan fungsi dengan karakter tambahan. Cukup dekat dengan panggilan fungsi.
Saya tidak memikirkan semua pro dan kontra, tetapi sepertinya dalam kedua bahasa Anda bisa lolos hanya dengan tanda kurung selama Anda membuat tanda kurung wajib untuk fungsi anonim. Sepertinya itu adalah:
Tanda kurung VS Notasi sedikit berbeda
Dalam kedua kasus Anda membuat pengecualian karena Anda membuat keduanya berperilaku berbeda. Karena ada perbedaan, Anda dapat membuatnya menjadi jelas dan menggunakan notasi yang berbeda. Kurung wajib akan terlihat alami dalam banyak kasus tetapi sangat membingungkan ketika hal-hal tidak berjalan sesuai rencana.
Ini dia Sekarang ini mungkin bukan penjelasan terbaik di dunia karena saya menyederhanakan sebagian besar detail. Juga sebagian besar adalah pilihan desain dan saya mencoba memberikan alasan bagi mereka tanpa menilai mereka. Saya suka elixir, saya suka ruby, saya suka panggilan fungsi tanpa tanda kurung, tetapi seperti Anda, saya menemukan konsekuensinya cukup sesekali sesekali.
Dan di elixir, hanya titik tambahan ini, sedangkan di ruby Anda memiliki blok di atas ini. Blok luar biasa dan saya terkejut betapa banyak yang dapat Anda lakukan hanya dengan blok, tetapi mereka hanya bekerja ketika Anda hanya membutuhkan satu fungsi anonim yang merupakan argumen terakhir. Maka karena Anda harus bisa berurusan dengan skenario lain, inilah seluruh metode / lambda / proc / block confusion.
Lagi pula ... ini di luar jangkauan.