Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 знак результата (для оператора %) всегда совпадает с знаком второго операнда.

Ответ 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]