web-dev-qa-db-ja.com

未定義のメソッド(NoMethodError)ruby

次のエラーメッセージが表示され続けます。

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
7
stecd

これは、メソッド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を使用しました。そうでなければ、それは無限ループを作成します。

16
Arup Rakshit
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メソッドで定義をラップしていますが、mainsは、choices()の定義の後でのみ呼び出します。

3
Marc Mance

Ruby EclipseでApp Academyの演習を行っているときに同じエラーが発生しました。提供されたテストケースに「object。」を追加するのを忘れました。次の構文は機能します:

      #!/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("===============================================")