2010-09-29 17 views
10

Tôi đang cố gắng tìm hiểu Ruby thông qua Koans nhưng tôi bị mắc kẹt ở bước thứ 6.Trợ giúp với Ruby Koans # 6 - Ngoại lệ nào đã bị bắt?

Dưới đây là các mã:

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 

tôi biết tôi phải thay thế __ với cái gì để làm với các thông báo lỗi "NoMethodError" nhưng tôi dường như không thể hình dung nó ra.

Đây là thông báo lỗi mà tôi nhận được khi tôi chạy "path_to_enlightenment.rb":

The answers you seek... 
    <"FILL ME IN"> expected but was <NoMethodError>. 

tôi sẽ thực sự đánh giá cao một số hướng dẫn với điều này - nó làm tôi phát điên! Tôi rất muốn biết câu trả lời và một lời giải thích có thể. Cảm ơn bạn!

Trả lời

12

Câu trả lời ở đây là "NoMethodError"

bạn cần các mục ở hai bên, để được bình đẳng, do đó làm cho cả hai ex.class sẽ làm điều đó.

Sau đó, bạn sẽ cần phải chuyển sang/__/Dưới đây.

+0

Cảm ơn bạn Elliot. – mmichael

+1

Đó không phải là loại gian lận đó sao? Thực hiện một kiểm tra vượt qua bằng cách đơn giản làm 1 == 1 là không hợp lệ, tôi sẽ nghĩ. Tôi đang cố gắng trả lời câu hỏi này quá – BobC

+2

Không, nó hỏi bạn bạn sẽ nhận được lỗi gì khi sử dụng phương thức mà đối tượng không biết. Và bởi vì khẳng định bằng nhau là tất cả về làm 1 == 1. NoMethodError phải bằng NoMethodError. – Elliot

0

Tôi chỉ ở trên Koen 83, nhưng trong hầu hết Koens, bạn có thể tìm thấy "câu trả lời" trong phần phù hợp có tiêu đề "The answers you seek..." ngay sau "<"FILL ME IN"> expected but was". Mỗi bây giờ và sau đó tôi đã phá vỡ khuôn khổ RubyKoan và tôi sẽ nhận được đồ họa ascii cũ này (Tôi không chắc chắn nếu nó được cho là nắm tay hoặc cây, nhưng hy vọng bạn biết nó khi bạn nhìn thấy nó); trong những trường hợp này, thông báo lỗi bên dưới đồ họa ascii đã hữu ích.

4

Tôi đã phải đưa câu lệnh assert_equal vào parens để có được điều này để vượt qua. Phải là một lỗi.

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(NoMethodError, ex.class) 

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

Bạn nhận được thông báo lỗi nào khi không có giấy phép? –

0

khi bạn điền vào NoMethodError, bạn cũng cần phải điền vào các thông báo lỗi (cái gì đó để tác dụng của "phương pháp xác định 'some_methd .."), bạn phải thay thế tất cả các/__/có kỳ hạn của bạn không chỉ là dấu gạch

3

Bạn cần phải thay __ với thực tế

assert_equal NoMethodError, ex.class 
1

Carlo Ledesma có câu trả lời chính xác. (assert_equal NoMethodError, ex.class) Không biết tại sao câu trả lời của Elliot được đánh giá cao nhất nếu ai đó yêu cầu bạn giải phương trình, 2x + 2 = 10, bạn không trả lời 2x + 2 = 2x + 2. Về mặt toán học, bạn sẽ đúng, nhưng đó không phải là câu trả lời.

1

Tôi vừa giải quyết vấn đề này. Tôi đã tập trung vào một dòng tại một thời điểm, nhưng phương pháp này bao gồm hai mục sẽ được thay đổi, một trong hàng 16, một trong hàng 20. Cả hai đều được yêu cầu để vượt qua bài học.

16: assert_equal NoMethodError, ex.class

20: assert_match(/*some_method_nil_doesnt_know_about*/, ex.message)

Hy vọng rằng sẽ giúp ai đó bị mắc kẹt!

1

Đối với dòng 20 tôi đã sử dụng điều này: assert_match(/some_method_nil_doesnt_know_about/, ex.message) Tôi không biết những ký tự "/" đó là gì. Tôi sẽ phải nghiên cứu nó, nhưng điều đó đã hiệu quả.

Tôi nghĩ rằng mẹo là 'some_method_nil_doesnt_know_about nằm trong dấu nháy đơn trong thông điệp, vì vậy nó đang tìm kiếm điều đó.

+0

Câu trả lời của bạn không thực sự trả lời câu hỏi, bạn có thể vui lòng chỉnh sửa câu trả lời của mình để phản ánh tốt hơn câu trả lời thực sự cho câu hỏi thay vì bình luận không? Nếu không, hãy viết bình luận (khi bạn có quyền làm như vậy). – xlm

0

Nếu bạn loại bỏ dấu ngoặc kép bạn có thể thêm một chút thông báo lỗi

assert_match(/undefined method/, ex.message) 
Các vấn đề liên quan