2014-04-29 14 views
16

Tôi đang chơi xung quanh với Ruby và cố gắng tạo một chương trình tài khoản ngân hàng nhỏ. Khi tôi chạy dòng này cụ thể của mã mà đang chạy withing các create_account:Ruby 'is_a?' lớp hoặc mô-đun yêu cầu (TypeError)

unless @response.is_a? Integer && @response.to_str.length == 4 
    puts "Your response must be 4 numbers in length." 
    create_account 
else 
    @pin = @response 
    puts "Your pin has been set." 
end 

tôi nhận được câu trả lời này:

bank_account.rb:24:in 'is_a?':class or module required (TypeError) 
    from bank_account.rb:24:in 'create_account' 
    from bank_account.rb:47:in '<main>' 

tôi có thể không chính xác tìm ra những gì đang xảy ra, nhưng tôi bao gồm phần còn lại của mã của tôi. Nó không đầy đủ, rõ ràng là vì tôi bị kẹt ở phần này. Tôi đi qua một vòng lặp while và nhập 'Create Account' để bắt đầu phương thức create_account. Mục tiêu của tôi là chạy điều kiện và yêu cầu người dùng nhập một số nguyên gồm 4 chữ số, giống như bất kỳ số pin ole nào. Nếu nó không phải là một số nguyên hay 4 chữ số, tôi gọi phương thức create_account để bắt đầu lại.

Tôi đang chạy ruby ​​2.0.0 nếu thông tin đó là cần thiết, nhưng tôi cược nó có khả năng hơn để làm với mã của tôi. Stackoverflow là mới đối với tôi, vì vậy tôi xin lỗi nếu câu hỏi này đã được yêu cầu. Tôi đã cố gắng làm bài tập về nhà của mình như được khuyên trước khi đặt câu hỏi, nhưng tôi vẫn còn bối rối. Bất kỳ trợ giúp được đánh giá cao.

Trả lời

42

Bạn cần phải đặt lớp Integer trong ngoặc đơn:

unless @response.is_a?(Integer) && @response.to_str.length == 4 

Bạn đang thực sự evaulating is_a? trên (Integer && @response.to_str.length == 4) đó là một giá trị boolean, không phải là một lớp học hoặc mô-đun.

+0

Tôi không nhận ra rằng nó đã bao gồm toàn bộ nửa thứ hai của điều kiện nếu tôi không đặt lớp đó vào dấu ngoặc đơn. Cảm ơn bạn. Tôi vẫn không thể làm cho nó chấp nhận một cái gì đó dài bốn con số vì một lý do nào đó, nhưng một vấn đề tại một thời điểm. –

+0

@MarkHJr, nếu '@ response' thực sự là một' Integer', thì bạn không thể gọi 'to_str' trên nó, chỉ' to_s'. Khi tôi thử kiểm tra của bạn trong giao diện điều khiển với giá trị '454524' tôi nhận được thông báo này: 'NoMethodError: phương thức undefined' to_str' cho 454524: Fixnum'. – maurice

+0

câu trả lời hay và giải thích! Giải quyết vấn đề của tôi thật nhanh khi có thể mất nhiều thời gian hơn. +1 –

Các vấn đề liên quan