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
Stringdeğil, Integerve ile de çalışacaktır Float. Bunun için de çalışıyor Decimalmu? (yüce metin yorumlayıcısı sözdizimini farklı şekilde vurgular ve Decimalbu 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.
fooya olacak true, falseya 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_ofDaha 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 Objectsı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