Aşağıdakilerden daha deyimsel bir şey var mı?
foo.class == String
Aşağıdakilerden daha deyimsel bir şey var mı?
foo.class == String
Yanıtlar:
Ben aradığınız düşünüyorum instance_of?
. is_a?
ve kind_of?
türetilmiş sınıflardan örnekler için true döndürür.
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
String
değil, Integer
ve ile de çalışacaktır Float
. Bunun için de çalışıyor Decimal
mu? (yüce metin yorumlayıcısı sözdizimini farklı şekilde vurgular ve Decimal
bu beni şüphelendirir)
Daha ördek yazarak bir yaklaşım söylemek olurdu
foo.respond_to?(:to_str)
to_str
bir nesnenin sınıfının String'in gerçek bir soyundan gelmeyebileceğini, ancak nesnenin kendisinin daha çok dizeye benzer (stringy?) olduğunu belirtir.
foo
ya olacak true
, false
ya da bir vanilya dize, ama onun iyi daha genel çözümler öğrenmek için.
to_str
, veya to_s
? İkisi biraz farklı.
Yapabilirsin:
foo.instance_of?(String)
Ve daha genel:
foo.kind_of?(String)
kind_of
Daha genel yapan nedir ? Onlar eşanlamlı olarak görünmektedir: is_a
.
instance_of?
bunun yerine demek istedim is_a?
.
Diğer yanıtlara ek olarak Class, bir nesnenin o sınıfın bir örneği olup olmadığını test etmek için === yöntemini tanımlar.
Bence daha iyi bir yol, bazı yüklem metotları yaratmaktır. Bu aynı zamanda "Tek Kontrol Noktası" nızı da kaydedecektir.
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
Daha fazla ördek yazma yolu;)
"string".is_a?(String)
. Görünüşe göre tekerleği yeniden icat ediyorsun. Orada da class
, instance_of
, kind_of
, maymun yama vb ... Kötü bir fikir Object
sınıfı, bu gereksiz söz değil.
pre_check("test".is_string?)
Artık proje gereksiniminiz değişecek ve üç veya daha fazla karakter içeren her String artık String olarak tanımlanmayacak (sıradışı olduğunu biliyorum;)) Artık kendi yönteminizi kolayca değiştirebilirsiniz.
is_a?
aslında kullanılacak daha uygun deyim olduğunu söyleyebilirim (ve genellikle Andrew Grimm'in bahsettiği gibi bir ördek yazım denetimi daha da iyidir). Katı bir sınıf karşılaştırması genellikle bir kod kokusudur. en.wikipedia.org/wiki/Liskov_substitution_principle