if counter % 2 == 1
我正在尝试解码这一行 - 这是一个 Rails 项目,我正在尝试找出 %
在这个 if 语句中的作用。
%
是 modulo 运算符。 counter % 2
的结果是counter / 2
的余数。
n % 2
通常是确定数字 n
是偶数还是奇数的好方法。如果 n % 2 == 0
,则该数为偶数(因为没有余数意味着该数可被 2 整除);如果 n % 2 == 1
,则该数字是奇数。
回答问题“% 符号在 Ruby 中的作用或含义是什么?”它是:
模二元运算符(如前所述)
17 % 10 #=> 7
替代字符串定界符标记
%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(.*) #=> /.*/
字符串格式运算符(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 美元。
另请记住,Ruby 对模 (
%
) 运算符的定义与 C 和 Java 的定义不同。在 Ruby 中,-7%3
是 2
。在 C 和 Java 中,结果是 -1
。在 Ruby 中,结果的符号(对于 %
运算符)始终与第二个操作数的符号相同。
它是模运算符,这是表示它是余数运算符的一种奇特方式。
因此,如果您将一个数字除以二,并且该数字的整数余数为一,那么您就知道该数字是奇数。您的示例检查奇数。
这样做通常是为了用不同的背景颜色突出显示奇数行,从而更容易读取大量数据。
这是一个非常基本的问题。
%
是模运算符 if counter % 2 == 1
对于每个奇数结果为 true
,对于每个偶数结果为 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
商向-无穷大舍入,如下表所示:
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)
当且仅当 x - y = km
为某个常数 k
。
这相当于余数。根据一些众所周知的定理,对于某个常数
a = bk + c
,我们可以得到 k
,其中 c
是余数,它给我们 a - c = bk
,这显然意味着 a == c (mod b)
。
(有没有办法在Stackoverflow上使用LaTeX?)