if counter % 2 == 1
我正在尝试解码这一行 - 这是一个Rails项目,我试图弄清楚%
在这个if语句中的作用。
答案 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 = 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)
(有没有办法在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.9,1.8.7,1.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%3
是2
。在C和Java中,结果是-1
。在Ruby中,结果的符号(对于%
运算符)始终与第二个操作数的符号相同。