Apa perbedaan antara
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
dan
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Untuk beberapa alasan, yang pertama kadang-kadang bekerja dan yang kedua tidak, dan kali lain, yang kedua bekerja dan yang pertama tidak. Mengapa? Mana yang merupakan cara yang "tepat" untuk melakukannya?
ruby
duck-typing
case-statement
Daisy Sophia Hollman
sumber
sumber
MyClass === obj
menggunakan metode Module # === untuk memeriksa apakahobj
merupakan instance dariMyClass
.Jawaban:
Anda harus menggunakan:
Saya memiliki masalah yang sama: Bagaimana cara menangkap kelas Errno :: ECONNRESET di "case when"?
sumber
Ya, Nakilon benar, Anda harus tahu bagaimana operator threequal === bekerja pada objek yang diberikan dalam
when
klausa. Di Rubybenar-benar
Memahami bahwa case memanggil metode threequal (
MyClass.===(item)
misalnya), dan metode itu dapat didefinisikan untuk melakukan apa pun yang Anda inginkan, dan kemudian Anda dapat menggunakan pernyataan case dengan precisionwsumber
arr = []
maka saya perhatikan bahwaif Array === arr
akan mengevaluasi ke true tetapiif arr === Array
akan mengevaluasi ke false. Bisakah seseorang tolong bantu menjelaskan?Kamu bisa memakai:
... ketika putaran berikut tidak memungkinkan:
Alasan untuk ini adalah yang
case
menggunakan===
, dan hubungan yang===
dijelaskan oleh operator tidak bersifat komutatif . Sebagai contoh,5
adalahInteger
, tetapiInteger
sebuah5
? Ini adalah bagaimana Anda harus memikirkancase
/when
.sumber
Di Ruby, nama kelas adalah konstanta yang merujuk ke objek tipe
Class
yang menggambarkan kelas tertentu. Itu berarti mengatakanMyClass
di Ruby sama dengan mengatakanMyClass.class
di Java.obj.class
adalah objek bertipeClass
menggambarkan kelasobj
. Jikaobj.class
iniMyClass
, makaobj
dibuat menggunakanMyClass.new
(berbicara kasar).MyClass
adalah objek bertipeClass
yang menjelaskan objek apa pun yang dibuat menggunakanMyClass.new
.MyClass.class
adalah kelas dariMyClass
objek (itu adalah kelas dari objek tipeClass
yang menggambarkan objek yang dibuat menggunakanMyClass.new
). Dengan kata lainMyClass.class == Class
,.sumber
Itu tergantung pada sifat
item
variabel Anda . Jika itu adalah instance dari objek, misalnyakemudian
tetapi jika itu adalah kelas itu sendiri misalnya
maka itu akan menjadi
Class
objek, jadiEDIT : silakan merujuk ke Cara menangkap kelas Errno :: ECONNRESET di "case when"? seperti yang dinyatakan oleh Nakilon karena jawaban saya bisa salah.
sumber