Frage

Ich bin neu in Ruby und vor kurzem lief in ein Problem auf Werte zu vergleichen, wenn eine Ruby on Rails-Anwendung. In einem Controller hatte ich die folgende Aussage, die immer falsch zurückgegeben:

if (user.id != params[:id])

Das Problem war die user.id (die ein Active Record ist) eine ganze Zahl und params [: id] eine Zeichenfolge ist. Es dauerte eine Weile, um dies herauszufinden und ich änderte es schließlich an:

if (user.id != params[:id].to_i)

Nun ist die Anweisung funktioniert wie erwartet.

Um diesen Fehler in Zukunft zu vermeiden ist es eine Möglichkeit, zu „übersetzen“ oder erhalten Ruby Sie zu warnen, wenn Sie versuchen, zwei verschiedene Arten zu vergleichen? Einige andere Fragen, die ich habe, dass lief in Ich mag würde zu „kompilieren Check“ sind:

  • Warnen, wenn ich eine Variable erstellen, aber nicht verwenden. Um für Tippfehler in Variablennamen zu überprüfen.
  • Stellen Sie sicher, dass ein Verfahren in der Klasse existiert, so kann ich Methodennamen Tippfehler vermeiden und auch Refactoring zu helfen, zum Beispiel, wenn ich eine Methode umbenannt.

Ich bin derzeit mit Ruby-1.8.6-27 RC2 mit Rails 2.3.2 und RadRails IDE unter Windows.

War es hilfreich?

Lösung 6

Die beste Lösung fand ich war eine IDE, die on-the-fly-Syntaxprüfung tat, wie RubyMine. Ich bin mir nicht sicher, ob es mein ursprüngliches Problem gelöst haben würde, aber es hat ich einige andere Syntax geholfen und kompiliert Fehler finden und beheben. Vielen Dank an alle für Ihre Anregungen.

Andere Tipps

Test zuerst, dann Code. Wenn Sie Tests schreiben, die alle Zweige Ihrer Anwendung abdecken, erhalten Sie die Gewissheit, dass Ihr Code beiden Läufe und korrekte Ergebnisse liefern.

EDIT: Ich mag darauf hinweisen, dass die Fähigkeit, zwei Arten zu vergleichen, hängt nicht von Methodennamen bis zur letzten Sekunde, etc. sind Kernfunktionen von Ruby.

Sie rufen keine Methode so viel wie Sie eine Nachricht an ein Objekt senden. Das Objekt ist dann verantwortlich für herauszufinden, wie die Methode zu behandeln. In Rails ist dies für den Zugriff auf DB-Spalten in Activerecord verwendet. Es gibt keine Methoden für die Spalten, bis eine Meldung mit dem Spaltennamen an das Objekt gesendet wird.

Statische Typisierung in Ruby geht gegen die Ente Typisierungssystem. Man kann oft Polymorphismus kostenlos bekommen, ohne sich Gedanken über komplexe Vererbung / Schnittstellensysteme.

Ich schlage vor, diese Funktionen umfassen und einen Ausgleich für die Unsicherheit durch die Prüfung

Rubin nicht zulässt, dass Sie den Operator == für Objekt neu zu definieren. In Ruby 1.8 können Sie nicht, wurde Ruby 1.9 tun soll, aber ich habe nicht in der Lage gewesen, meinen Skript arbeitet für Core-Klassen zu erhalten. Es funktioniert gut für benutzerdefinierte definierten Objekte.

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end

Unter der Annahme, ich habe einige dumme Codierungsfehler nicht tun, ist die Antwort NEIN: Sie können nicht überprüfen, ob Sie verschiedene Arten von Objekten vergleichen

.

Auch ich würde sagen, dass Sie dies nicht tun. Eigentlich ist Rubin nicht auf diese Weise zu arbeiten entworfen, das ist eher ein Java-Ansatz eher als Ruby-Stil.

Ruby nicht sicher sein soll. Damit können Sie zwei Objekte vergleichen, und das ist, wo viel von seiner Macht kommt. Rails würde ohne eine solche dynamische Design nicht möglich sein.

Auch eine kompilierte Sprache wie Java oder C werden Sie nicht davon abhalten == auf zwei Objekte zu tun. Wie Ben sagte, ist es am besten, zuerst zu testen. Überprüfen Sie die Strukturen, die Sie gerade arbeiten. Eine Möglichkeit, um Informationen über ein Ruby-Objekt zu verwenden:

puts object.class

Im Allgemeinen ist die beste Art und Weise (ich kenne), diese Art von Problem für dynamische / Skriptsprachen zu vermeiden ist „Logik“ zu Methoden / Befehle zu bewegen und Unit-Tests für sie schreiben. Im Grunde alles, was fehlschlagen kann, sollte geprüft werden. Der Code auf der Seite sollte stumm Logik ... anstatt Anzeige nur die Elemente, die bestimmte Kriterien erfüllen, sollte es alle Elemente angezeigt werden, und dass die Liste der Elemente aus einem Verfahren erhalten, die nur diejenigen zurückgibt, die angezeigt werden sollen.

Zwei Dinge, die ich würde vorschlagen:

One: Informieren Sie sich über IRB (oder Skript / Konsole für Schienen). Eine gängige Praxis Entwicklung in dynamischen Sprachen ist in einem „live“ Interpreter Code-Schnipsel zu versuchen (wie IRB oder die Schienen-Konsole). Diese Praxis geht auf die frühesten dynamischen Sprachen wie Smalltalk und Lisp zurück. Ruby-debug ist auch wirklich nützlich für die Behandlung von Problemen und wäre eine wirklich einfache Möglichkeit, um herauszufinden, den Fehler in Ihrem Beispiel hat.

Zwei: Informieren Sie sich über "Duck Typing". „Typen“ und Variablen arbeiten ein wenig anders in Ruby als viele Leute um sie zu erwarten. Wie ich es, eine Variable wie user.id verstehen keinen „Typ“. Der Wert deutete auf von user.id einen Typ hat, aber die Variable selbst nicht. Ich glaube, das ist ein Teil davon, warum kein Werkzeug gibt es, dass Sie gesagt haben würde, was Ihr Fehler im Voraus war das Programm ausgeführt wird. diese beiden Variablen zu vergleichen ist kein Fehler, da die Variablen keinen Typ haben. user.id deutet auf eine ganze Zahl an diesem Punkt in Ihrem Programm, aber es wäre völlig legal sein zuweisen user.id in eine Zeichenfolge zu zeigen, an welcher Stelle, dass der Vergleich viel mehr Sinn gemacht hätte. : -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top