Что делает оператор% в Ruby в N% 2?

if counter% 2 == 1 Я пытаюсь декодировать это line - это проект Rails, и я пытаюсь выяснить, что % делает в этом операторе if.

25
задан John Topley 5 February 2018 в 13:27
поделиться

7 ответов

% - оператор по модулю . Результатом counter% 2 является остаток counter / 2 .

n% 2 часто является хорошим способом определить, является ли число n четным или нечетным. Если n% 2 == 0 , число четное (поскольку отсутствие остатка означает, что число делится на 2 без остатка); если n% 2 == 1 , число нечетное.

48
ответ дан 28 November 2019 в 17:46
поделиться

Независимо от того, как он работает, оператор по модулю, вероятно, не лучший код для этой цели (хотя нам и не дают подробного контекста). Как Йорг упомянул в комментарии, выражение if counter.odd? , вероятно, является намерением и более читабельно.

Если это код представления и используется для определения (например) чередующихся цветов строк, то вы можете вообще обойтись без счетчика, используя встроенный помощник Rails cycle () . Например, вы можете использовать cycle ('odd', 'even') как имя класса для строки таблицы, исключив счетчик и окружающую логику if / then.

Еще одна мысль: если это внутри блока each , вы можете использовать each_with_index и исключить постороннюю переменную счетчика.

Мой рефакторинг 0,02 доллара.

1
ответ дан 28 November 2019 в 17:46
поделиться

Это оператор по модулю. Он дает остаток, когда счетчик делится на 2.

For example:
3 % 2 == 1  
2 % 2 == 0
2
ответ дан 28 November 2019 в 17:46
поделиться

Это оператор по модулю.

http://en.wikipedia.org/wiki/Modulo_operation

0
ответ дан 28 November 2019 в 17:46
поделиться

Это оператор по модулю, который представляет собой причудливый способ сказать, что это оператор остатка.

Итак, если вы разделили число на два, а целочисленный остаток от этого числа равен единице, то вы знаете, что число нечетное. В вашем примере проверяются нечетные числа.

Часто это делается для выделения строк с нечетными числами другим цветом фона, что упрощает чтение больших списков данных.

0
ответ дан 28 November 2019 в 17:46
поделиться

Чтобы дать несколько способов выразить это:

  • Оператор по модулю
  • Оператор остатка
  • Модульный остаток

Строго говоря, если 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?)

0
ответ дан 28 November 2019 в 17:46
поделиться

Это очень простой вопрос. % является оператором по модулю , если счетчик% 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]
0
ответ дан 28 November 2019 в 17:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: