Ваш второй код завершается ошибкой, потому что Ruby вернет значение последнего вычисленного выражения, если оно достигнет конца метода без обработки оператора return
. Последнее выражение было (2..(num - 1)).each { ... }
, а each
возвращает объект, для которого он был вызван. Убедитесь, что вы возвращаете что-либо во время или после each
.
Af для своего третьего кода, между all? { |a| a == b }
и none? { a != b }
нет никакой разницы в эффективности. Они полностью эквивалентны. Как поясняется в комментариях, тестирование до квадратного корня достаточно, а тестирование до n-1
является излишним. Но ошибка в том, что вы оцениваете, является ли что-то простым или нет, а затем отбрасываете эту информацию и печатаете "This is a prime number."
независимо.
Чтобы не повторяться, вы можете сделать несколькоразные вещи. Отделите тест от печати:
def is_it_prime(num)
return true if num <= 1
n = 2
limit = Math.sqrt(num)
while n <= limit
return false if num % n == 0
n += 1
end
return true
end
def is_it_prime(num)
if is_it_prime_for_real(num)
return "This is a prime number"
else
return "This is not a prime number"
end
end
Выполните составной тест:
def is_it_prime(num)
if num <= 1 or (2..Math.sqrt(num)).all? { |m| num % m != 0 }
"This is not a prime number"
else
"This is a prime number"
end
end
Используйте константы, чтобы избежать дублирования литералов:
IS_PRIME = "This is a prime number"
IS_NOT_PRIME = "This is not a prime number"
def is_it_prime(num)
return IS_NOT_PRIME if num <= 1
return IS_PRIME if (2..Math.sqrt(num)).none? { |m| (num % m).zero? }
IS_NOT_PRIME
end
...