if counter% 2 == 1
Я пытаюсь декодировать это line - это проект Rails, и я пытаюсь выяснить, что %
делает в этом операторе if.
%
- оператор по модулю . Результатом counter% 2
является остаток counter / 2
.
n% 2
часто является хорошим способом определить, является ли число n
четным или нечетным. Если n% 2 == 0
, число четное (поскольку отсутствие остатка означает, что число делится на 2 без остатка); если n% 2 == 1
, число нечетное.
Независимо от того, как он работает, оператор по модулю, вероятно, не лучший код для этой цели (хотя нам и не дают подробного контекста). Как Йорг упомянул в комментарии, выражение if counter.odd?
, вероятно, является намерением и более читабельно.
Если это код представления и используется для определения (например) чередующихся цветов строк, то вы можете вообще обойтись без счетчика, используя встроенный помощник Rails cycle ()
. Например, вы можете использовать cycle ('odd', 'even')
как имя класса для строки таблицы, исключив счетчик и окружающую логику if / then.
Еще одна мысль: если это внутри блока each
, вы можете использовать each_with_index и исключить постороннюю переменную счетчика.
Мой рефакторинг 0,02 доллара.
Это оператор по модулю. Он дает остаток, когда счетчик делится на 2.
For example:
3 % 2 == 1
2 % 2 == 0
Это оператор по модулю, который представляет собой причудливый способ сказать, что это оператор остатка.
Итак, если вы разделили число на два, а целочисленный остаток от этого числа равен единице, то вы знаете, что число нечетное. В вашем примере проверяются нечетные числа.
Часто это делается для выделения строк с нечетными числами другим цветом фона, что упрощает чтение больших списков данных.
Чтобы дать несколько способов выразить это:
Строго говоря, если a% b = c
, c
является уникальной константой, такой что
a == c (mod b)
и 0 <= c
Где x == y (mod m)
iff x - y = km
для некоторой константы k
.
Это эквивалентно остатку. По известной теореме a = bk + c
для некоторой константы k
, где c
- остаток, что дает нам a - c = bk
, что, очевидно, означает a == c (mod b)
.
(Есть ли способ использовать LaTeX в Stackoverflow?)
Это очень простой вопрос. %
является оператором по модулю , если счетчик% 2 == 1
приводит к истина
для каждого нечетного числа и ложь
для каждого четного числа. .
Если вы изучаете рубин, вам следует научиться использовать irb
, там вы можете попробовать разные вещи и, возможно, сами ответить на вопрос.
попробуйте ввести
100.times{|i| puts "#{i} % 2 == 1 #=> #{i % 2 == 1}"}
в вашу консоль irb
irb и увидеть результат, тогда должно быть ясно, что делает %
.
И вам действительно стоит взглянуть на документацию по api rails ( 1.9 , 1.8.7 , 1.8.7 ), там вы найдете ответ два на ваш вопрос % (Fixnum) с дополнительной ссылкой на подробное описание divmod (Numeric) :
Возвращает массив, содержащий частное и модуль, полученные делением числа пользователя aNumeric. > Если q, r = x.divmod (y), то
q = floor (float (x) / float (y)) х = д * у + г
Частное округляется в сторону бесконечности, как показано в следующей таблице:
a | б | a.divmod (b) | а / б | a.modulo (b) | а. остаток (б) ------ + ----- + --------------- + --------- + ----------- - + --------------- 13 | 4 | 3, 1 | 3 | 1 | 1 ------ + ----- + --------------- + --------- + ----------- - + --------------- 13 | -4 | -4, -3 | -3 | -3 | 1 ------ + ----- + --------------- + --------- + ----------- - + --------------- -13 | 4 | -4, 3 | -4 | 3 | -1 ------ + ----- + --------------- + --------- + ----------- - + --------------- -13 | -4 | 3, -1 | 3 | -1 | -1 ------ + ----- + --------------- + --------- + ----------- - + --------------- 11,5 | 4 | 2, 3,5 | 2,875 | 3.5 | 3.5 ------ + ----- + --------------- + --------- + ----------- - + --------------- 11,5 | -4 | -3, -0,5 | -2,875 | -0,5 | 3.5 ------ + ----- + --------------- + --------- + ----------- - + --------------- -11,5 | 4 | -3, 0,5 | -2,875 | 0,5 | -3,5 ------ + ----- + --------------- + --------- + ----------- - + --------------- -11,5 | -4 | 2 -3,5 | 2,875 | -3,5 | -3.5
Примеры
11.divmod (3) # => [3, 2] 11.divmod (-3) # => [-4, -1] 11.divmod (3.5) # => [3, 0.5] (-11) .divmod (3.5) # => [-4, 3.0] (11.5) .divmod (3.5) # => [3, 1.0]