2010-08-25 9 views
12

Ich habe vor kurzem versucht, meine Schienen Fähigkeiten mit diesem Werkzeug schärfen:Gibt es eine zusätzliche Anleitung/Antwortschlüssel für Ruby Koans?

http://github.com/edgecase/ruby_koans

aber ich Mühe habe einige Tests vorbei. Auch bin ich mir nicht sicher, ob ich einige Dinge richtig mache, da das Ziel nur darin besteht, den Test zu bestehen, es gibt viele Wege, es zu bestehen und ich tue etwas, das nicht den Standards entspricht.

Gibt es eine Möglichkeit zu bestätigen, ob ich die Dinge richtig mache?

ein konkretes Beispiel:

in about_nil,

def test_nil_is_an_object 
    assert_equal __, nil.is_a?(Object), "Unlike NULL in other languages" 
end 

so ist es mir zu sagen, ob die zweite Klausel auf ein Objekt gleich ist zu prüfen (so kann ich sagen, nil ist ein Objekt) oder put assert_equal true, nil.is_a?(Object) weil die Aussage wahr ist?

und der nächste Test:

def test_you_dont_get_null_pointer_errors_when_calling_methods_on_nil 
    # What happens when you call a method that doesn't exist. The 
    # following begin/rescue/end code block captures the exception and 
    # make some assertions about it. 
    begin 
    nil.some_method_nil_doesnt_know_about 
    rescue Exception => ex 
    # What exception has been caught? 
    assert_equal __, ex.class 

    # What message was attached to the exception? 
    # (HINT: replace __ with part of the error message.) 
    assert_match(/__/, ex.message) 
    end 
end 

im Erraten Ich sollte ein "No-Methode Fehler" Zeichenfolge im assert_match setzen, aber was ist mit dem assert_equal?

+0

Interessant, nicht über die koans wusste, ich muss versuchen, sie. Vielleicht um Hilfe bitten oder nach Ratschlägen zu Dingen suchen, von denen Sie nicht denken, dass sie richtig sind, aber wenn Sie genauer sind, werden Sie bessere Antworten bekommen. – Chubas

Antwort

9

assert_equal true, nil.is_a?(Object) ist in der Tat die richtige Lösung. Die Frage ist "Sind Nils in Ruby-Objekten oder nicht?", Und in Rubys Fall sind sie. Um die Behauptung zu bestehen, sollten Sie also die Wahrheit dieses Tests bestätigen. Wenn Sie eine undefinierte Methode für null aufrufen, erhalten Sie NoMethodError: undefined method 'foo' for nil:NilClass. Daher lautet die Ausnahmeklasse NoMethodError und die Nachricht lautet undefined method 'foo' for nil:NilClass. Testen Sie das fehlgeschlagene Verhalten in einer Konsole und sehen Sie, was Sie daraus erhalten, und wenden Sie dieses Wissen dann auf den Test an.

+1

danke für den Kopf! Bedeutet das, dass ich meinen Instinkten vertrauen muss, um zu wissen, ob das, was ich getan habe, richtig war? Gibt es keine Möglichkeit zu überprüfen, ob das, was ich getan habe, korrekt und der Rubin-Konvention entspricht? – corroded

+0

manchmal gibt es mehr als einen richtigen Weg, um eine Antwort zu formulieren, wie im richtigen Leben –

2

Nun, mit dem typischen TDD-Motto von Red-Green-Refactor sollten Sie den Test (wahrscheinlich mit Rake in einer separaten Konsole) ausführen und sehen, dass der Fehler auftritt. Von dort haben sie Ihnen ein paar Informationen über das, was erwartet wurde, zur Verfügung gestellt.

Was Stil betrifft, lehren die Koans das nicht wirklich. Sie sollten nur einen in Ruby geschriebenen Code finden und lesen, um ein Gefühl für die typischen Konventionen und Idiome der Ruby-Community zu bekommen.

+0

In welcher Datei würden Sie 'Rake' verwenden? – isomorphismes

1

Ich erinnere mich, als ich das tat, dass ich versuchte, den Test aus denken und versuchte, in

<Answer> and <"Answer"> 

das Ding zu setzen zu erinnern ist, dass die tatsächliche Klasse nicht in einem String sein muss oder etwas . Die Antwort ist also NICHT

ex.class, ex.class 

Wie oben vorgeschlagen, setzen Sie den Code in irb und ausführen.

(1..5).class == Range 

ist ein großer Hinweis

5

Sind Sie mit

ruby path_to_enlightenment.rb 

an der Eingabeaufforderung, nachdem Sie jeden Test korrekt? Es wird dir viel helfen.

Auch "erinnere mich, dass Stille manchmal die beste Antwort ist" - wenn Sie ratlos sind, fügen Sie nichts ein und das Tool wird Ihnen helfen.

2

Einfachheit ist der Schlüssel zu Ruby Koans - als ich angefangen habe, dachte ich, es muss härter sein als das, was es ist, aber es ist nicht! Frag einfach IRB die Frage, die Koans dich stellt, und nach ein paar bekommst du ein Gefühl dafür. Ich habe einen Blog-Stück darüber geschrieben, anderen zu helfen, auch:

Ruby Koans Answers

Verwandte Themen