Bagaimana saya bisa memeriksa apakah suatu variabel didefinisikan dalam Ruby? Apakah ada isset
metode tipe yang tersedia?
ruby
reflection
Hanya baca
sumber
sumber
nil
yang diinisialisasi.||=
operator) di bawah ini.defined?
masih mengembalikan true untuk variabel yang didefinisikan dalam blok itu!defined?
itu mengembalikan boolean?!!defined?(object_name)
Ini berguna jika Anda tidak ingin melakukan apa pun jika memang ada, tetapi buat jika itu tidak ada.
Ini hanya membuat instance baru sekali. Setelah itu terus mengembalikan var.
sumber
||=
dengan nilai boolean, jangan sampai Anda merasakan sakit kebingungan.nil
juga, kecuali jika Anda benar - benar ingin mengevaluasi ekspresi setiap kali dipanggil kembalinil
var = (var or var.nil?)
Sintaks yang benar untuk pernyataan di atas adalah:
mengganti (
var
) dengan variabel Anda. Sintaks ini akan mengembalikan nilai benar / salah untuk evaluasi dalam pernyataan if.sumber
defined?(var) == nil
?.nil?
lebih idiomatis, seperti yang mereka katakan. Ini lebih "berorientasi objek" untuk menanyakan objek jikanil
daripada menggunakan operator perbandingan. Tidak ada yang sulit dibaca, jadi gunakan yang mana saja yang membantu Anda mengirimkan lebih banyak produk.defined?(your_var)
akan bekerja. Bergantung pada apa yang Anda lakukan, Anda juga bisa melakukan sesuatuyour_var.nil?
sumber
your_var.nil?
karena mengembalikan true of false dan jauh lebih baik untuk membaca dan menulis daripadadefined? var
. Terima kasih untuk ini.your_var.nil?
akan menghasilkan kesalahan:undefined local variable or method your_var
bila tidak ditentukan sebelumnya ...Coba "kecuali" daripada "jika"
sumber
Gunakan
defined? YourVariable
Keep it simple konyol ..;)
sumber
Ini ada beberapa kode, bukan ilmu roket tapi itu bekerja dengan cukup baik
Jelas, kode pewarnaan tidak diperlukan, hanya visualisasi yang bagus dalam contoh mainan ini.
sumber
nil?
ini opsional.PERINGATAN Re: Pola Ruby Umum
Ini adalah kunci jawaban:
defined?
metode. Jawaban yang diterima di atas menggambarkan hal ini dengan sempurna.Tapi ada hiu, bersembunyi di bawah ombak ...
Pertimbangkan jenis pola ruby umum ini:
method2
selalu kembalinil
. Pertama kali Anda meneleponmethod1
,@x
variabel tidak disetel - karena itumethod2
akan dijalankan. danmethod2
akan diatur@x
kenil
. Itu baik, dan semuanya baik-baik saja. Tapi apa yang terjadi saat Anda menelepon kedua kalimethod1
?Ingat @x sudah disetel ke nol.
But method2
masih akan berjalan lagi !! Jika method2 adalah usaha mahal, ini mungkin bukan sesuatu yang Anda inginkan.Biarkan
defined?
metode datang ke penyelamatan - dengan solusi ini, kasus tertentu ditangani - gunakan yang berikut:Iblis ada dalam rinciannya: tetapi Anda dapat menghindari hiu yang mengintai itu dengan
defined?
metode itu.sumber
Anda dapat mencoba:
Karena mengembalikan boolean.
sumber
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
pernyataan tampaknya terlalu rumitSeperti banyak contoh lain menunjukkan Anda tidak benar-benar membutuhkan boolean dari suatu metode untuk membuat pilihan logis dalam ruby. Ini akan menjadi bentuk yang buruk untuk memaksa semuanya ke boolean kecuali Anda benar-benar membutuhkan boolean.
Tetapi jika Anda benar-benar membutuhkan boolean. Gunakan !! (bang bang) atau "falsy falsy mengungkapkan kebenaran".
Mengapa biasanya tidak membayar untuk memaksa:
Berikut adalah contoh di mana itu penting karena bergantung pada paksaan implisit dari nilai boolean untuk representasi stringnya.
sumber
Harus disebutkan bahwa menggunakan
defined
untuk memeriksa apakah bidang tertentu diatur dalam hash mungkin berperilaku tak terduga:Sintaksnya benar di sini, tetapi
defined? var['unknown']
akan dievaluasi ke string"method"
, sehinggaif
blok akan dieksekusisunting: Notasi yang benar untuk memeriksa apakah kunci ada dalam hash adalah:
sumber
Harap perhatikan perbedaan antara "terdefinisi" dan "ditugaskan".
x didefinisikan meskipun tidak pernah ditugaskan!
sumber
NameError Exception: undefined local variable or method
, dan bingung ketika satu-satunya penugasan / penyebutan variabel berada di blok if yang tidak terkena.Selain itu, Anda dapat memeriksa apakah itu didefinisikan dalam string melalui interpolasi, jika Anda kode:
Sistem akan memberi tahu Anda jenisnya jika sudah ditentukan. Jika tidak didefinisikan, itu hanya akan mengembalikan peringatan yang mengatakan variabel tidak diinisialisasi.
Semoga ini membantu! :)
sumber
defined?
bagus, tetapi jika Anda berada di lingkungan Rails Anda juga dapat menggunakantry
, terutama dalam kasus di mana Anda ingin memeriksa nama variabel dinamis:sumber