2017-03-20 1 views
0

Ich versuche, eine safe_Int (n) zu tun.Anpassen Ausnahme Nachricht für eine Ganzzahl-Konvertierung - Ruby

Wenn die Eingabe kein "integerble" -Wert (zB: 123 oder '123') ist, sollte ein TypeError zurückgegeben werden und die Meldung: "# {n} muss eine Zahl sein".

Hier ist, was ich getan habe:

def safe_Int(n) 
begin 
    Integer(n) rescue TypeError 
rescue TypeError => e 
    puts "#{n} is not a number" 
end 
end 

Ich bin nicht in der Lage, die Nachricht anzuzeigen, die ich will.

ich „keine implizite Konvertierung der Klasse in Integer“ bekommen

Wie kann ich die Fehlermeldung anpassen?

+1

Dies ist wahrscheinlich eine schlechte Idee. '.to_i' ist der sichere Weg, um zu konvertieren, es funktioniert auf so ziemlich alles, was sich in eine ganze Zahl zwingen kann. Hard-Casting ist ein ziemlich unhandlicher Ansatz. Genauso wenig ist es hilfreich, Exceptions in eine zufällige Ausgabe zu konvertieren, die einfach ignoriert, was ernsthafte Probleme sein könnte. – tadman

+0

.to_i ist nicht gut für meine Bedürfnisse ... Ich muss auch die gleiche Nachricht für boolean bekommen. –

Antwort

0

nicht sagen, dass ich denke, das ist eine gute Idee, aber Integer(n) wirft eine ArgumentError kein TypeError so sollten Sie Ihren Code so etwas wie:

def safe_int(n) 
    Integer(n) 
rescue ArgumentError => e 
    puts "#{n} is not a number" 
end 
+0

Sie können Recht haben oder nicht: D .. das war eine Diskussion, die Matz hatte [link] (https://bugs.ruby-lang.org/issues/2830) ist TypeError eine Unterklasse von ArgumentError? aber ich brauche es wirklich als TypeError, zeige diese Nachricht ... –

+0

Alles was ich weiß ist, dass 'Integer ('a')' mir einen 'ArgumentError' gibt :) Dein Code war ein wenig verwirrend, kannst du erklären, was du versuchst machen? –

+0

natürlich ist es verwirrend! Ich lerne! LOL !! : D Ich versuche eine Herausforderung bei codewars.com zu machen. Ich habe herausgefunden, wie es geht ... und nachdem ich die "Best Practice" -Lösung gesehen habe !! Hey, es war wirklich einfach! 'Integer (n) Rettung Raise TypeError.new" # {n} ist ungültig "' –

1

Ok! Gefunden, was ich suchte:

def safe_Int(n) 
Integer(n) 
rescue 
    raise TypeError.new "#{n} is not a number!" 
end 

obs: Ich bin nicht den vollständigen Code zeigt, so dass ich nicht der Spoiler für die Herausforderung sein.

+1

Das verwechselt viele Ruby-Konventionen, Methodennamen sollten nur Kleinbuchstaben sein, aber alles, was Sie tun müssen, wenn das Ihr Ziel ist ist: 'raise TypeError," ... "' wobei 'new' nicht explizit notwendig ist. Das zweite Argument wird automatisch für Sie an den Konstruktor weitergeleitet. – tadman

+0

gut gemacht !! Danke, dass du das gesehen hast! Ich werde mehr Aufmerksamkeit schenken und Kleinbuchstaben behalten! Tnks! –

Verwandte Themen