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

if counter % 2 == 1我试图解码这一行 – 它是一个Rails项目,我试图找出% if在这个if语句中的作用。

%是模运算符。 counter % 2的结果是counter / 2的余数。

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

回答问题“%符号在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" # ie choose your own bracket pair %q(hello world) #=> 'hello world' %x(pwd) #=> `pwd` %r(.*) #=> /.*/ 

3)字符串格式运算符(Kernel :: sprintf的简写)

 "05d" % 123 #=> "00123" 

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

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

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

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

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

我的重构是0.02美元。

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

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

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

这是一个非常基本的问题。 if counter % 2 == 1对于每个奇数都为trueif counter % 2 == 1 %是模运算符,对于每个偶数,结果为false

如果你正在学习ruby,你应该学习如何使用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] 

提出几种说法:

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

严格来说,如果a % b = c ,则c是唯一常数

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

其中x == y (mod m) iff x - y = km对于某些常数k

这相当于其余部分。 根据一些众所周知的定理,对于某个常数k ,我们得到a = bk + c ,其中c是余数,它给出a - c = bk ,这显然意味着a == c (mod b)

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

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