if counter % 2 == 1
Я пытаюсь декодировать эту строку - это проект Rails, и я пытаюсь выяснить, что %
делает в этом операторе if.
Что делает оператор% в Ruby в N% 2?
Ответ 1
%
является оператором modulo. Результатом counter % 2
является остаток от counter / 2
.
n % 2
часто является хорошим способом определить, является ли число n
четным или нечетным. Если n % 2 == 0
, число четное (потому что ни один остаток не означает, что число равномерно делится на 2); если n % 2 == 1
, число нечетное.
Ответ 2
В ответ на вопрос "Что означает символ или символ в Ruby?" Это:
1) По модулю двоичный оператор (как уже упоминалось)
17 % 10 #=> 7
2) Альтернативный токен разделителя строк
%Q{hello world} #=> "hello world"
%Q(hello world) #=> "hello world"
%Q[hello world] #=> "hello world"
%Q!hello world! #=> "hello world"
# i.e. choose your own bracket pair
%q(hello world) #=> 'hello world'
%x(pwd) #=> `pwd`
%r(.*) #=> /.*/
3) Оператор форматирования строк (сокращение для Kernel:: sprintf)
"05d" % 123 #=> "00123"
Ответ 3
Это оператор modulo. Он дает остаток, когда счетчик делится на 2.
For example:
3 % 2 == 1
2 % 2 == 0
Ответ 4
Независимо от того, как это работает, оператор modulo, вероятно, не лучший код для этой цели (хотя нам не уделяется много внимания). Как отметил Йорг в комментарии, выражение if counter.odd?
, вероятно, является намерением и более читаемо.
Если это код просмотра и используется для определения (например) чередующихся цветов строк, то вы можете обойтись без счетчика, используя встроенный помощник Rails cycle()
. Например, вы можете использовать cycle('odd','even')
как имя класса для строки таблицы, исключая счетчик и окружение if/then logic.
Другая мысль: если это находится в блоке each
, вы можете использовать each_with_index и исключить постороннюю переменную счетчика.
Мой рефакторинг $0,02.
Ответ 5
Также имейте в виду, что определение Ruby оператора modulo (%
) отличается от языка C и Java. В Ruby -7%3
есть 2
. В C и Java результатом является -1
. В Ruby знак результата (для оператора %
) всегда совпадает с знаком второго операнда.
Ответ 6
Его модуль-оператор.
Ответ 7
Это оператор modulo, который является причудливым способом сказать его оператором остатка.
Итак, если вы разделили число на два, а целочисленный остаток от этого числа равен единице, то вы знаете, что число было нечетным. Ваш пример проверяет нечетные числа.
Часто это делается для выделения строк нечетного числа с другим цветом фона, что упрощает чтение больших списков данных.
Ответ 8
Чтобы дать несколько способов сказать это:
- Оператор Modulo
- Оператор останова
- Модульный остаток
Строго говоря, если a % b = c
, c
- единственная константа такая, что
a == c (mod b)
и 0 <= c < b
Где x == y (mod m)
iff x - y = km
для некоторой константы k
.
Это эквивалентно остатку. По известной теореме мы имеем, что a = bk + c
для некоторой константы k
, где c
- остаток, который дает нам a - c = bk
, что, очевидно, означает a == c (mod b)
.
(Можно ли использовать LaTeX для Stackoverflow?)
Ответ 9
Это очень простой вопрос. %
является модульным оператором if counter % 2 == 1
для true
для каждого нечетного числа и false
для каждого четного числа.
Если вы изучаете рубин, вы должны научиться использовать irb
, там вы можете попробовать все и, возможно, сами ответить на вопрос.
попробуйте ввести
100.times{|i| puts "#{i} % 2 == 1 #=> #{i % 2 == 1}"}
в консоль IRB irb
и посмотрите результат, чем должно быть ясно, что делает %
.
И вы действительно должны взглянуть на документацию на rails api (1.9, 1.8.7, 1.8.7), там вы бы нашли ответ на два вопроса % (Fixnum) с дополнительной ссылкой на подробное описание divmod ( Числовой):
Возвращает массив, содержащий коэффициенты и модуль, полученные путем деления num на aNumeric. > Если q, r = x.divmod(y), то
q = floor(float(x)/float(y)) x = q*y + r
Фактор округляется до -infinity, как показано в следующей таблице:
a | b | a.divmod(b) | a/b | a.modulo(b) | a.remainder(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]