%运算符在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
对于每个奇数都为true
, if 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%3
是2
。 在C和Java中,结果是-1
。 在Ruby中,结果的符号(对于%
运算符)始终与第二个操作数的符号相同。