Jika saya mendefinisikan fungsi Ruby seperti ini:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Bagaimana saya bisa menyebutnya hanya memasok 2 argumen pertama dan argumen terakhir? Kenapa tidak seperti itu
ldap_get( base_dn, filter, , X)
mungkin atau jika memungkinkan, bagaimana cara melakukannya?
ruby
optional-parameters
Bruno Antunes
sumber
sumber
scope
benar dan Anda meneruskanfalse
,scope ||= true
tidak akan berfungsi. Ini mengevaluasi samanil
dan akan mengaturnya ketrue
xyz||=true
. Ini mengatakan jika nihil, itu selalu benar. Jika itu benar, itu benar.scope ||= true
, saya terkejut bahwa tidak ada yang menyebutkan bahwa cara yang lebih baik untuk melakukan ini adalah denganscope = LDAP::LDAP_SCOPE_SUBTREE if scope.nil?
. Tentu saja, itu pun dengan asumsi bahwa itunil
adalah nilai yang tidak valid.nil
. Beberapa mungkin menyukai notasi:ldap_get(base_dn, filter, _, X)
(Catatan: Saya belum tahu (belum) kapan ini diperkenalkan di Ruby. Benang SO yang menarik ).Anda hampir selalu lebih baik menggunakan hash opsi.
sumber
options = default_options.merge(options)
Waktu telah berlalu dan sejak versi 2 Ruby mendukung parameter bernama:
sumber
Tidak mungkin melakukannya dengan cara yang Anda tentukan
ldap_get
. Namun, jika Anda mendefinisikanldap_get
seperti ini:Sekarang kamu bisa:
Tetapi sekarang Anda memiliki masalah yang tidak dapat Anda sebut dengan dua argumen pertama dan argumen terakhir (masalah yang sama seperti sebelumnya tetapi sekarang argumen terakhir berbeda).
Alasannya sederhana: Setiap argumen di Ruby tidak diharuskan memiliki nilai default, jadi Anda tidak bisa menyebutnya seperti yang Anda tentukan. Dalam kasus Anda, misalnya, dua argumen pertama tidak memiliki nilai default.
sumber
1) Anda tidak dapat membebani metode ( Mengapa ruby tidak mendukung metode kelebihan beban? ) Jadi mengapa tidak menulis metode baru sama sekali?
2) Saya memecahkan masalah serupa menggunakan operator percikan * untuk array dengan panjang nol atau lebih. Kemudian, jika saya ingin mengirimkan parameter yang saya bisa, itu diartikan sebagai array, tetapi jika saya ingin memanggil metode tanpa parameter apa pun maka saya tidak perlu melewatkan apa pun. Lihat Bahasa Pemrograman Ruby halaman 186/187
sumber
Baru-baru ini saya menemukan jalan keluarnya. Saya ingin membuat metode di kelas array dengan parameter opsional, untuk menyimpan atau membuang elemen dalam array.
Cara saya mensimulasikan ini adalah dengan melewatkan array sebagai parameter, dan kemudian memeriksa apakah nilai pada indeks itu nihil atau tidak.
Mencoba metode kelas kami dengan parameter berbeda:
keluaran:
["1", "2", "a", "b", "c"]
Oke, keren itu berfungsi sesuai rencana. Sekarang mari kita periksa dan lihat apa yang terjadi jika kita tidak meneruskan opsi parameter ketiga (1) dalam array.
keluaran:
["a", "b", "c"]
Seperti yang Anda lihat, opsi ketiga dalam larik telah dihapus, sehingga memulai bagian yang berbeda dalam metode dan menghapus semua nilai ASCII yang tidak berada dalam jangkauan kami (32-126)
Alternatifnya, kita bisa mengeluarkan nilai nihil dalam parameter. Yang akan terlihat mirip dengan blok kode berikut:
sumber
Mungkin saja :) Ubah saja definisi
untuk
scope sekarang akan berada dalam array di tempat pertama. Ketika Anda memberikan 3 argumen, maka Anda akan menetapkan base_dn, filter dan attrs dan param_array akan menjadi [] Ketika 4 dan lebih banyak argumen maka param_array akan menjadi [argument1, or_more, and_more]
Kelemahannya adalah ... ini adalah solusi yang tidak jelas, sangat jelek. Ini untuk menjawab bahwa dimungkinkan untuk menghilangkan argumen di tengah pemanggilan fungsi di ruby :)
Hal lain yang harus Anda lakukan adalah menulis ulang nilai default dari scope.
sumber
attrs=nil
) setelah splat (*param_array
).¶meter
, tetapi di Ruby 1.9 bisa diikuti oleh "parameter biasa" juga. Dalam kedua kasus tersebut tidak ada parameter dengan hukum default setelah parameter dengan percikan.Anda dapat melakukan ini dengan aplikasi parsial, meskipun menggunakan variabel bernama pasti menghasilkan kode yang lebih mudah dibaca. John Resig menulis artikel blog pada tahun 2008 tentang cara melakukannya di JavaScript: http://ejohn.org/blog/p Partial-functions-in-javascript/
Mungkin akan memungkinkan untuk menerapkan prinsip yang sama di Ruby (kecuali untuk pewarisan prototipe).
sumber