Ошибка неопределенного метода в синтаксисе ruby - PullRequest
1 голос
/ 16 марта 2012

Я не знаю почему, но он все время говорит, что простой метод? (Num) не определен ...
Я пытаюсь сделать так, чтобы он находил произведение простых чисел между 1 и 20

class LCM200        
  def prime?(num)
    if num == 1 then 
        return false
    end
    range = Math.sqrt(num)
    for i in 2..range           
        if num%i == 0
            return false
        end     
        return true
    end
  end
#if __FILE__ == $0
  lcm = 1
  for j in 1..20 do
    if prime?(j)
      lcm *= j
    end
  end       
  puts lcm
#end
end

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Проблема в том, что вы запускаете код внутри класса.Внутри класса prime? определяется как метод экземпляра класса, однако, когда вы запускаете цикл for внутри класса, который вы вызываете prime?, как если бы это был метод класса (он же статический метод).Чтобы исправить это, просто удалите объявления классов:

def prime?(num)
    if num == 1 then 
        return false
    end

    range = Math.sqrt(num)
    for i in 2..range

        if num%i == 0
            return false
        end
    end

    # Note: moved return true to here since otherwise it would return
    # true after a single iteration
    return true
end

lcm = 1

for j in 1..20 do
    if prime?(j)
        lcm *= j
    end
end

puts lcm

Вы также можете определить prime? более "Ruby-ish" способом:

def prime? num
  if num == 1
    false
  else
    (2..Math.sqrt(num)).all? { |i| i % num != 0 }
  end
end

Документация для перечислимых # все?

1 голос
/ 16 марта 2012

Вам не нужно определять свою собственную функцию prime?.Начиная с Ruby 1.9, вы можете просто вызывать функцию prime? библиотеки mathn следующим образом:

  • require 'mathn'
  • 13.prime?

Пример этого в действии:

$ irb
irb(main):001:0> require 'mathn'
=> true
irb(main):002:0> 1.prime?
=> false
irb(main):003:0> 3.prime?
=> true
irb(main):004:0> 11.prime?
=> true
irb(main):005:0> 20.prime?
=> false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...