Non ruby 1.9.2 hanno un is_a? funzione?
-
28-09-2019 - |
Domanda
I googled che c'è una funzione is_a?
per verificare se un oggetto è un numero intero oppure no.
Ma ho provato a console rotaie, e non funziona.
I correva il codice come il seguente:
"1".is_a?
1.is_a?
Mi sono perso qualcosa?
Soluzione
Non c'è un costruito in funzione per dire se una stringa è effettivamente un intero, ma si può facilmente fare il vostro proprio:
class String
def int
Integer(self) rescue nil
end
end
Questo funziona perché il metodo Integer()
Kernel genera un errore se la stringa non può essere convertito in un numero intero, e le spire linea rescue nil
che errore in un nullo.
Integer("1") -> 1
Integer("1x") -> nil
Integer("x") -> nil
e quindi
"1".int -> 1 (which in boolean terms is `true`)
"1x".int -> nil
"x".int -> nil
Si potrebbe alterare la funzione di true
ritorno nei veri casi, al posto del numero intero in sé, ma se si sta testando la stringa per vedere se si tratta di un numero intero, è probabile che si desidera utilizzare tale intero per qualcosa! Ho molto comunemente faccio cose come questa:
if i = str.int
# do stuff with the integer i
else
# error handling for non-integer strings
end
Anche se l'assegnazione in una posizione di prova offende voi, si può sempre fare in questo modo:
i = str.int
if i
# do stuff with the integer i
else
# error handling for non-integer strings
end
In ogni caso, questo metodo non solo la conversione di una volta, che se si deve fare un sacco di questi, può essere un vantaggio significativo di velocità.
[cambiato nome della funzione da int?
a int
per evitare che implica che dovrebbe tornare solo true / false.]
Altri suggerimenti
Hai dimenticato di includere la classe si stava testando contro:
"1".is_a?(Integer) # false
1.is_a?(Integer) # true
Ho usato un'espressione regolare
if a =~ /\d+/
puts "y"
else
p 'w'
end
Ruby ha una funzione chiamata respond_to? che può essere utilizzato per vedere se una particolare classe o oggetto ha un metodo con un certo nome. La sintassi è qualcosa di simile
User.respond_to?('name') # returns true is method name exists
otherwise false
http: / /www.prateekdayal.net/2007/10/16/rubys-responds_to-for-checking-if-a-method-exists/
Forse questo ti aiuterà a
str = "1"
=> "1"
num = str.to_i
=> 1
num.is_a?(Integer)
=> true
str1 = 'Hello'
=> "Hello"
num1 = str1.to_i
=> 0
num1.is_a?(Integer)
=> true
volevo qualcosa di simile, ma nessuno di questi ha fatto per me, ma questo si fa - l'uso di "classe":
a = 11
a.class
=> Fixnum