Я работаю над проблемами в Project Euler , чтобы научиться программировать на Ruby. Я знаю, что для этого есть встроенная функция , но я избегаю встроенных функций, которые помогают мне учиться.
Поэтому я должен написать метод, чтобы определить, является ли число простое. Первый метод работает, а второй нет. Кто-нибудь может объяснить, почему?
def is_prime n
for d in 2..(n - 1)
if (n % d) == 0
return false
end
end
true
end
def is_prime2 n
foundDivider = false
for d in 2..(n - 1)
foundDivider = ((n % d) == 0) or foundDivider
end
not foundDivider
end
Это потому, что =
имеет более высокий приоритет, чем или
. См. Таблицу приоритетов операторов Ruby ниже (от самого высокого к самому низкому приоритету):
[ ] [ ]=
**
! ~ + -
* / %
+ -
>> <<
&
^ |
<= < > >=
<=> == === != =~ !~
&&
||
.. ...
? :
= %= { /= -= += |= &= >>= <<= *= &&= ||= **=
defined?
not
or and
if unless while until
begin/end
Проблемная строка анализируется как...
(foundDivider = ((n % d) == 0)) or foundDivider
... что, безусловно, не то, что вы имеете в виду. Есть два возможных решения:
Выберите приоритет, который вы действительно имеете в виду...
foundDivider = (((n % d) == 0) or foundDivider)
...или используйте вместо этого оператор ||
, который имеет более высокий приоритет, чем =
:
foundDivider = ((n % d) == 0) || foundDivider