Czy jest coś bardziej idiomatycznego niż poniższe?
foo.class == String
Czy jest coś bardziej idiomatycznego niż poniższe?
foo.class == String
Odpowiedzi:
Myślę, że szukasz instance_of?. is_a?i kind_of?zwróci wartość true dla wystąpień z klas pochodnych.
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, ale także z Integeri Float. Czy to też działa Decimal? (wzniosły interpreter tekstu inaczej podkreśla składnię, Decimalco sprawia, że jestem podejrzliwy)
Można by powiedzieć, że bardziej typowe byłoby podejście do pisania na klawiaturze
foo.respond_to?(:to_str)
to_str wskazuje, że klasa obiektu może nie być rzeczywistym potomkiem String, ale sam obiekt jest bardzo podobny do ciągu (stringy?).
fooalbo będzie true, falsealbo ciąg wanilia, ale to dobrze, aby dowiedzieć się więcej ogólnych rozwiązań.
to_str, czy to_s? Te dwa są nieco inne.
Możesz to zrobić:
foo.instance_of?(String)
A bardziej ogólnie:
foo.kind_of?(String)
kind_ofbardziej ogólne? Wydają się być synonimem: is_a.
instance_of?zamiast is_a?.
Oprócz innych odpowiedzi, Class definiuje metodę === do sprawdzania, czy obiekt jest instancją tej klasy.
Myślę, że lepszym sposobem jest stworzenie metod predykatów. Spowoduje to również zapisanie „pojedynczego punktu kontroli”.
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
Im bardziej kaczkowy sposób pisania;)
"string".is_a?(String). Wygląda na to, że odkrywasz koło na nowo. Jest też class, instance_of, kind_of, itd ... zły pomysł, aby małpa patch Objectklasa, nie wspominając, że to niepotrzebny.
pre_check("test".is_string?) Teraz wymagania twojego projektu ulegną zmianie i każdy łańcuch z trzema lub więcej znakami nie jest już zdefiniowany jako String (wiem, że jest niezwykły;)) Teraz możesz łatwo zmienić własną metodę.
is_a?jest w rzeczywistości bardziej odpowiednim idiomem (a często sprawdzanie pisania na klawiaturze, o którym wspomina Andrew Grimm, jest jeszcze lepsze). Ścisłe porównanie klas to zwykle zapach kodu. en.wikipedia.org/wiki/Liskov_substitution_principle