Что делает оператор% в Ruby в N% 2? - PullRequest
25 голосов
/ 19 августа 2010

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

Ответы [ 9 ]

48 голосов
/ 19 августа 2010

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

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

39 голосов
/ 18 марта 2014

В ответ на вопрос "Что символ% означает или означает в 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"
2 голосов
/ 19 августа 2010

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

For example:
3 % 2 == 1  
2 % 2 == 0
1 голос
/ 18 сентября 2013

Также имейте в виду, что определение Ruby оператора modulo (%) отличается от определения C и Java.В Ruby -7%3 - это 2.В C и Java результат равен -1.В Ruby знак результата (для оператора %) всегда совпадает со знаком второго операнда.

1 голос
/ 19 августа 2010

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

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

Другая мысль: если это в блоке each, вы можетевозможность использовать each_with_index и исключить постороннюю переменную counter.

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

0 голосов
/ 19 августа 2010

Это очень простой вопрос.% - это оператор по модулю if counter % 2 == 1 приводит к true для каждого нечетного числа и к false для каждого четного числа.

Если вы изучаете рубин, вы должны научиться использовать irb, там вы можете попробовать и, возможно, сами ответить на вопрос.

попробуйте ввести

100.times{|i| puts "#{i} % 2 == 1 #=> #{i % 2 == 1}"}

в вашу irb irb консоль и посмотреть вывод, чем должно быть понятно, что% делает.

И вы действительно должны взглянуть на документацию API рельсы ( 1.9 , 1.8.7 , 1.8.7 ), там вы бы нашли ответ два на ваш вопрос % (Fixnum) с дополнительной ссылкой на подробное описание divmod (Числовой) :

Возвращает массив, содержащий частное и модуль, полученные путем деления числа на число.> Если 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]
0 голосов
/ 19 августа 2010

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

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

Строго говоря, если a % b = c, c является уникальной константой, такой что

a == c (mod b) и 0 <= c < b

Где x == y (mod m) тогда и только x - y = km для некоторой константы k.

Это эквивалентно остатку.По известной теореме у нас есть a = bk + c для некоторой константы k, где c - остаток, что дает нам a - c = bk, что, очевидно, означает a == c (mod b).

(Есть лиспособ использовать LaTeX на Stackoverflow?)

0 голосов
/ 19 августа 2010

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

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

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

0 голосов
/ 19 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...