web-dev-qa-db-fra.com

méthode non définie (NoMethodError) ruby

Je continue à recevoir le message d'erreur suivant:

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

Mais je n'arrive pas à comprendre pourquoi ma méthode est "non définie": 

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

En effet, vous appelez la méthode choices avant de la définir. Écrivez le code comme ci-dessous:

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)

J'ai utilisé break pour sortir de la boucle while. Sinon, cela créera une boucle infinie.

15
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

La méthode doit seulement être appelée avant d'être exécutée. Ici, j’enveloppe la définition dans la méthode main, mais n’appelle main qu'après la définition de choices ().

3
Marc Mance

J'avais la même erreur en exécutant Ruby dans Eclipse en travaillant sur les exercices pratiques d'App Academy. J'ai oublié d'ajouter "objet". aux cas de test fournis. La syntaxe suivante fonctionne: 

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