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 Integere Float. Funziona anche per Decimal? (il sublime interprete del testo evidenzia la sintassi in modo diverso per Decimalcui 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?).
foosarà o true, falseo 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_ofpiù 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 Objectclasse, 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