Ruby sınıf türleri ve durum ifadeleri


135

Arasındaki fark nedir

case item.class
when MyClass
  # do something here
when Array
  # do something different here
when String
  # do a third thing
end

ve

case item.class
when MyClass.class
  # do something here
when Array.class
  # do something different here
when String.class
  # do a third thing
end

Nedense bunlardan ilki bazen işe yarıyor, ikincisi çalışmıyor, diğer zamanlarda ikincisi çalışıyor ve birincisi çalışmıyor. Neden? Bunu yapmanın "doğru" yolu hangisidir?


1
String bir sınıftır. Bir sınıfın sınıfı Class'tır.
Volte

Not MyClass === objkullanan Modülü # === olmadığını kontrol etmek yöntemini objbir örneğidir MyClass.
sergio

Yanıtlar:


234

Kullanmalısın:

case item
when MyClass
...

Aynı problemi yaşadım: Errno :: ECONNRESET sınıfını "case when" de nasıl yakalarım?


1
Teşekkürler! Aldattığım için üzgünüm (veya bir nevi kandırdığım için), ancak birkaç arama önceki soruyu ortaya çıkarmadı. Görünüşe göre case ifadesi tarafından === kullanımı oldukça yaygın bir problem, şimdi sorunun bu olduğunu görüyorum. Bu muhtemelen eğitimlerde ve benzerlerinde daha sık belirtilmelidir (ancak bahse girerim birçok eğitim yazarının da bunun farkında değildir).
Daisy Sophia Hollman

4
ActiveRecord kullanılıyorsa belirtilmeyen bir uyarı. Sınıf karşılaştırmalarındaki ActiveRecord === yöntemi .is_a? Kullanır; bu, bir sınıfın alt sınıflarının case deyiminde doğru olarak değerlendirileceği anlamına gelir. github.com/rails/rails/blob/…
Jeremy Baker

61

Evet, Nakilon haklı, threequal === operatörünün whencümlede verilen nesne üzerinde nasıl çalıştığını bilmelisiniz . Ruby'de

case item
when MyClass
...
when Array
...
when String
...

gerçek

if MyClass === item
...
elsif Array === item
...
elsif String === item
...

Durumun üç eşit bir yöntemi çağırdığını anlayın ( MyClass.===(item)örneğin) ve bu yöntemin istediğiniz her şeyi yapmak için tanımlanabileceğini ve ardından case ifadesini hassas bir şekilde kullanabilirsiniz.


Eğer arr = []öyleyse, if Array === arrbunun doğru olarak if arr === Arraydeğerlendirileceğini ancak yanlış olarak değerlendirileceğini fark ettim . Biri lütfen açıklamaya yardım edebilir mi?
Daniel

4
=== sadece bir sınıfın tasarımcısının yapmasını istediği şeyi yapmak için tanımlanabilen bir yöntemdir. Ayrıca, a === b'nin gerçekten a anlamına geldiğini unutmayın. === b, yani a ve b'yi değiştirirseniz, farklı davranışlar elde edebilirsiniz. ==='nin değişmeli olduğunun garantisi yoktur. Aslında, Array === Dizi yanlıştır, ancak Object === Object doğrudur, bu yüzden Array === anlamını yeniden tanımlıyor.
Fred


5

Ruby'de, bir sınıf adı, Classbelirli bir sınıfı tanımlayan türdeki bir nesneyi ifade eden bir sabittir . Bu MyClass, Ruby'de söylemenin MyClass.classJava'da söylemeye eşdeğer olduğu anlamına gelir .

obj.classClasssınıfını tanımlayan türde bir nesnedir obj. Eğer obj.classbir MyClass, daha sonra objkullanılarak oluşturuldu MyClass.new(kabaca konuşma). kullanılarak oluşturulan herhangi bir nesneyi tanımlayan MyClasstürde Classbir nesnedir MyClass.new.

MyClass.classsınıfıdır MyClassnesne (öyle sınıf Çeşidi nesnenin Classkullanılarak oluşturulan herhangi bir nesne anlatmaktadır MyClass.new). Başka bir deyişle MyClass.class == Class,.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.