未定义的方法(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

这是因为您在定义方法之前调用方法 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 方法中,但仅在 choices() 的定义之后调用 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("===============================================")

最新更新