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 Integer
i Float
. Czy to też działa Decimal
? (wzniosły interpreter tekstu inaczej podkreśla składnię, Decimal
co 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?).
foo
albo będzie true
, false
albo 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_of
bardziej 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 Object
klasa, 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