C'è qualcosa di più idiomatico del seguente?
foo.class == String
C'è qualcosa di più idiomatico del seguente?
foo.class == String
Risposte:
Penso che tu stia cercando instance_of?
. is_a?
e kind_of?
restituirà true per istanze da classi derivate.
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
, ma anche con Integer
e Float
. Funziona anche per Decimal
? (il sublime interprete del testo evidenzia la sintassi in modo diverso per Decimal
cui mi insospettisce)
Sarebbe da dire un approccio più anatra
foo.respond_to?(:to_str)
to_str
indica che la classe di un oggetto potrebbe non essere un discendente effettivo della stringa, ma l'oggetto stesso è molto simile a una stringa (filante?).
foo
sarà o true
, false
o una stringa di vaniglia, ma è bene imparare soluzioni più generali.
to_str
, o to_s
? I due sono leggermente diversi.
Tu puoi fare:
foo.instance_of?(String)
E il più generale:
foo.kind_of?(String)
kind_of
più generale? Essi sembrano essere sinonimi: is_a
.
instance_of?
invece di is_a?
.
Oltre alle altre risposte, Class definisce il metodo === per verificare se un oggetto è un'istanza di quella classe.
Penso che un modo migliore sia creare alcuni metodi predicativi. Ciò salverà anche il tuo "punto di controllo unico".
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
Il modo di scrivere più anatra;)
"string".is_a?(String)
. Sembra che tu stia reinventando la ruota. C'è anche class
, instance_of
, kind_of
, ecc ... cattiva idea di patch di scimmia della Object
classe, per non parlare che è inutile.
pre_check("test".is_string?)
Ora i requisiti del tuo progetto cambieranno e ogni stringa con tre caratteri o più non è più definita come stringa (lo so che è insolito;)) Ora puoi cambiare facilmente il tuo metodo.
is_a?
è in realtà l'idioma più appropriato da usare (e spesso un controllo di battitura a papera come menzionato da Andrew Grimm è ancora migliore). Un rigoroso confronto di classe è solitamente un odore di codice. en.wikipedia.org/wiki/Liskov_substitution_principle