undefined method (NoMethodError) ruby

醉酒当歌 提交于 2019-11-28 04:01:32

问题


I keep getting the following error message:

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

But I can't seem to understand why my method is "undefined":

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

回答1:


This is because you are calling method choices, before defining it. Write the code as below:

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)

I used break, to exit from the while loop. Otherwise it will create an infinite loop.




回答2:


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

The method only needs to be called prior to being executed. Here I wrap the definition in the main method, but only call main after the definition of choices().




回答3:


I was getting the same error running Ruby in Eclipse working out the App Academy practice exercises. I forgot to add "object." to the supplied test cases. The following syntax works:

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


来源:https://stackoverflow.com/questions/21072355/undefined-method-nomethoderror-ruby

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!