未定义的方法(NoMethodError)ruby

我一直收到以下错误消息:

text.rb:2:in `': 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 

这是因为您在定义方法之前调用方法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循环。 否则它将创建一个无限循环。

 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方法中包装了定义,但是在choice()的定义之后只调用main。

我在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("===============================================")