%运算符在N%2中的Ruby中做了什么?

时间:2010-08-18 22:25:46

标签: ruby syntax

if counter % 2 == 1我正在尝试解码这一行 - 这是一个Rails项目,我试图弄清楚%在这个if语句中的作用。

9 个答案:

答案 0 :(得分:48)

%modulo运算符。 counter % 2的结果是counter / 2的剩余部分。

n % 2通常是确定数字n是偶数还是奇数的好方法。如果n % 2 == 0,则数字是偶数(因为没有余数表示该数字可被2整除);如果n % 2 == 1,则该数字为奇数。

答案 1 :(得分:39)

回答问题“%符号在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 :(得分:2)

这是模运算符。当计数器除以2时,它给出余数。

For example:
3 % 2 == 1  
2 % 2 == 0

答案 3 :(得分:1)

无论它是如何工作的,模运算符可能不是用于此目的的最佳代码(即使我们没有给出太多上下文)。正如Jörg在评论中提到的,表达式if counter.odd?可能是意图,并且更具可读性。

如果这是视图代码并用于确定(例如)交替的行颜色,那么您可以通过使用内置的Rails助手cycle()完全没有计数器。例如,您可以使用cycle('odd','even')作为表行的类名,从而消除计数器和周围的if / then逻辑。

另一个想法:如果这是在each块内,你可以使用each_with_index并消除无关的计数器变量。

我的重构是0.02美元。

答案 4 :(得分:0)

答案 5 :(得分:0)

它是模运算符,这是一种说它是余数运算符的奇特方式。

因此,如果您将数字除以2,并且该数字的整数余数为1,那么您就知道该数字是奇数。您的示例检查奇数。

通常这样做是为了突出显示具有不同背景颜色的奇数行,从而更容易阅读大量数据。

答案 6 :(得分:0)

提供几种说法:

  • 模数运算符
  • 剩余运营商
  • 模块化残留物

严格来说,如果a % b = cc是唯一常量,那么

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)

(有没有办法在Stackoverflow上使用LaTeX?)

答案 7 :(得分:0)

这是一个非常基本的问题。对于每个奇数,%if counter % 2 == 1的结果true,每个偶数都会false。{/ p>

如果你正在学习ruby,你应该学会如何使用irb,你可以在那里试一试,也许你自己回答这个问题。

尝试输入

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

进入irb irb控制台并查看输出,而不应该清楚%的内容。

你真的应该看一下rails api文档(1.91.8.71.8.7),你会在那里找到你的问题的答案% (Fixnum)进一步链接到divmod (Numeric)的详细说明:

  

返回一个数组,其中包含通过将num除以aNumeric得到的商和模数。 &GT;如果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]

答案 8 :(得分:0)

还要记住,Ruby对modulo(%)运算符的定义与C和Java的定义不同。在Ruby中,-7%32。在C和Java中,结果是-1。在Ruby中,结果的符号(对于%运算符)始终与第二个操作数的符号相同。