2014-01-12 150 views
6

我不断收到以下错误信息:未定义的方法(NoMethodError)红宝石

text.rb:2:in `<main>': undefined method `choices' for main:Object (NoMethodError) 

但我似乎无法理解为什么我的方法是“不确定”:

puts "Select [1] [2] [3] or [q] to quit"; users_choice = gets.chomp 
choices(users_choice) 

def choices (choice)  
    while choice != 'q'  
     case choice 

     when '1' 
      puts "you chose one!" 

     when '2' 
      puts "you chose two!" 

     when '3' 
      puts "you chose three!" 
     end  
    end 
end 
+0

您在调用它之后定义了方法选择 –

+2

对于高级语言,Ruby应该能够允许前向声明。 Objective-C允许它。 – Snowcrash

回答

15

这是因为在定义之前,您正在调用方法choices。编写代码如下:

puts "Select [1] [2] [3] or [q] to quit" 
users_choice = gets.chomp 

def choices (choice)  
    while choice != 'q'  
    case choice 
    when '1' 
     break puts "you chose one!" 
    when '2' 
     break puts "you chose two!" 
    when '3' 
     break puts "you chose three!" 
    end  
    end 
end 

choices(users_choice) 

我以前break,从while循环退出。否则它会创建一个无限循环。

+0

当然,谢谢。 – stecd

+0

嗯,我认为这不应该是原因,因为在Ruby中调用它之前或调用之后定义变量没有区别。 – ImranNaqvi

+1

@ImranNaqvi你确定吗? –

3
def main 
puts "Select [1] [2] [3] or [q] to quit"; users_choice = gets.chomp 
choices(users_choice) 
end 

def choices (choice) 
    while choice != 'q' 
    case choice 

     when '1' 
     puts "you chose one!" 
     break 
     when '2' 
     puts "you chose two!" 
     break 
     when '3' 
     puts "you chose three!" 
     break 
    end 
    end 
end 

main 

该方法只需要在执行前调用。在这里,我将这个定义包装在main方法中,但是只在choose()的定义之后调用main。

0

我在Eclipse中运行Ruby时遇到了同样的错误,正在执行App Academy练习练习。我忘了添加“对象”。到提供的测试用例。以下语法的工作原理如下:

 #!/usr/bin/ruby 
     class Prime 
     # Write a method that takes in an integer (greater than one) and 
     # returns true if it is prime; otherwise return false. 
     # 
     # You may want to use the `%` modulo operation. `5 % 2` returns the 
     # remainder when dividing 5 by 2; therefore, `5 % 2 == 1`. In the case 
     # of `6 % 2`, since 2 evenly divides 6 with no remainder, `6 % 2 == 0`. 
     # More generally, if `m` and `n` are integers, `m % n == 0` if and only 
     # if `n` divides `m` evenly. 
     # 
     # You would not be expected to already know about modulo for the 
     # challenge. 
     # 
     # Difficulty: medium. 

     def primer(number) 
     if number < 2 
      return false 
     end 
     i = 10 
     while i > 1 
      if number > i && number != i 
      if number % i == 0 
       return false 
      end 
      end 
      i -= 1 
     end 
     return true 
     end 
    end 

     object = Prime. new 

     # These are tests to check that your code is working. After writing 
     # your solution, they should all print true. 

     puts("\nTests for #primer") 
     puts("===============================================") 
      puts('primer(2) == true: ' + (object.primer(2) == true).to_s) 
      puts('primer(3) == true: ' + (object.primer(3) == true).to_s) 
      puts('primer(4) == false: ' + (object.primer(4) == false).to_s) 
      puts('primer(9) == false: ' + (object.primer(9) == false).to_s) 
     puts("===============================================") 
相关问题