2010-11-26 5 views
2

Ich googelte, dass es eine is_a? Funktion gibt, um zu überprüfen, ob ein Objekt eine Ganzzahl ist oder nicht.Hat Rubin 1.9.2 eine is_a? Funktion?

Aber ich habe versucht in Schienen-Konsole, und es funktioniert nicht.

lief ich den Code wie folgt aus:

"1".is_a? 
1.is_a? 

Habe ich etwas verpasst?

+1

Google ist nett, aber es ist nicht der erste Ort, um nach dem zu suchen, was in Rubys Standard- und Kernbibliotheken enthalten ist. Ich würde empfehlen, zur primären Quelle zu gehen: der eigenen Maschine 'ri' oder der [rubydoc site] (http://www.ruby-doc.org/).Die Eingabe von 'ri is_a?' In Ihrer Kommandozeile könnte einige Treffer zurückliefern, mit dem wichtigen 'Object.is_a?'. –

+0

Verwandte Frage zu dem, was Sie versuchen: [Anzahl aus dem Zeichenfolgenmuster mit regulärem Ausdruck abrufen ] (http://stackoverflow.com/questions/694176/retrieve-number-from-the-string-pattern-using-regular-expression) –

Antwort

3

Es gibt nicht eine integrierte Funktion zu sagen, ob ein String ist effektiv eine ganze Zahl , aber Sie können leicht Ihre eigene machen:

class String 
    def int 
    Integer(self) rescue nil 
    end 
end 

Dies funktioniert, weil die Kernel-Methode Integer() einen Fehler auslöst, wenn die Zeichenfolge nicht in eine Ganzzahl konvertiert werden kann, und der Inline-Code rescue nil diesen Fehler in eine Null umwandelt.

Integer("1") -> 1 
Integer("1x") -> nil 
Integer("x") -> nil 

und damit:

"1".int -> 1 (which in boolean terms is `true`) 
"1x".int -> nil 
"x".int -> nil 

Sie die Funktion verändern könnten true in den wahren Fällen zurückzukehren, statt der ganzen Zahl selbst, aber wenn Sie die Zeichenfolge sind testen, ob es sich um eine ganze Zahl ist Wahrscheinlich möchtest du diese Ganzzahl für etwas verwenden! Ich mache sehr häufig Sachen wie diese:

if i = str.int 
    # do stuff with the integer i 
else 
    # error handling for non-integer strings 
end 

Obwohl, wenn die Zuordnung in einer Testposition anstößigen Inhalt enthält, können Sie es immer tun, wie folgt:

i = str.int 
if i 
    # do stuff with the integer i 
else 
    # error handling for non-integer strings 
end 

So oder so, ist diese Methode nur, dass die Umwandlung einmal, was, wenn Sie eine Menge von diesen tun müssen, kann ein erheblicher Geschwindigkeitsvorteil sein.

[Geänderte Funktionsnamen von int? zu int zu vermeiden, was impliziert, sollte es nur wahr/falsch zurück.]

+0

stehlte meine Antwort und minined es. Guter Junge, ja. – Nakilon

+0

Nur um klar zu sein, ich habe deine Bearbeitung erst nach der Veröffentlichung gesehen, und ich war es nicht, der dich abwertete. –

+0

Hm ... Also wer war es? ... – Nakilon

0

Ruby hat eine Funktion namens respond_to? das kann verwendet werden, um zu sehen, ob eine bestimmte Klasse oder ein bestimmtes Objekt eine Methode mit einem bestimmten Namen hat. Die Syntax ist so etwas wie

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/

+0

'respond_to?' ist sehr verschieden von 'is_a?'. –

+0

@Greg: 'is_a?' Schaut auf die Klasse, während 'respond_to? 'Für die Eingabe von Enten nützlich wäre. –

+0

+1: In Ruby ist es besser zu prüfen, ob das Objekt das tut, was es tun soll, als es eine Instanz einer Klasse ist. Ruby stützt sich mehr auf "duck typing" als auf strenge Vererbung. –

19

Sie haben vergessen, die Klasse gehören Sie gegen testeten:

"1".is_a?(Integer) # false 
1.is_a?(Integer) # true 
+0

danke, in der Tat ist meine Situation, ich möchte eine Zeichenfolge überprüfen, ist eine Zahl, wenn "1" .is_a? (Ingeger) falsch zurückgeben, es scheint nicht nützlich für diese Situation – mlzboy

+1

@mlzboy: Soweit ich weiß, Ruby behandelt "1" 'als String und nicht als eine potenzielle ganze Zahl. Sie müssen '2 +" 2 ".to_i' oder' 2 + Integer (2) 'tun - Sie können' 2 + "2" 'nicht tun. Vielleicht möchten Sie lesen [Ist Rubin stark oder schwach typisiert?] (Http://stackoverflow.com/questions/520228/is-ruby-strongly-or-weakly-typed) –

+0

Wie wurde dies meine zweitmutigste Antwort ? –

1

i verwendet einen regulären Ausdruck

if a =~ /\d+/ 
    puts "y" 
else 
    p 'w' 
end 
+0

Oder '/ [\ - \ +]? \ D + (?: \. \ D +)? (?: [EE] [\ - \ +]? \ D +)? /' ... – Nakilon

0

Vielleicht wird dies helfen Ihnen

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 
+0

Beide '" 1 " 'und' 'Hallo' 'endete mit' wahr'. Wolltest du das machen? –

+0

@Andrew Ich weiß, dass beide mit der Wahrheit endete. Aber ich dachte, dass es einen Unterschied darin gibt, wenn eine Zeichenfolge in Integer wie in "Hello" konvertiert wird, erhalten wir 0 als Wert. Das könnte also der entscheidende Punkt sein. – Rohit

+0

Von der Zeichenfolge # to_i docs: Wenn es am Anfang von str keine gültige Zahl gibt, wird 0 zurückgegeben. –

0

Ich wollte etwas ähnliches, aber keiner von diesen hat es für mich getan, aber dieses tut - verwenden Sie "Klasse":

a = 11 
a.class 
=> Fixnum