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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top