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

问题描述 投票:0回答:9

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

ruby syntax
9个回答
49
投票

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

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


41
投票

回答问题“% 符号在 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 时的余数。

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

1
投票

无论它如何工作,模运算符可能不是达到此目的的最佳代码(即使我们没有给出太多上下文)。正如 Jörg 在评论中提到的,表达方式

if counter.odd?
可能就是意图,并且更具可读性。

如果这是视图代码并用于确定(例如)交替行颜色,那么您可以通过使用内置的 Rails 帮助器

cycle()
来完全不需要计数器。例如,您可以使用
cycle('odd','even')
作为表行的类名,从而消除计数器和周围的 if/then 逻辑。

另一个想法:如果这是在

each
块内,您可以使用each_with_index 并消除无关的计数器变量。

我的重构 0.02 美元。


1
投票

另请记住,Ruby 对模 (

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


0
投票

0
投票

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

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

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


0
投票

这是一个非常基本的问题。

%
是模运算符
if counter % 2 == 1
对于每个奇数结果为
true
,对于每个偶数结果为
false

如果您正在学习 ruby,您应该学习如何使用

irb
,您可以尝试一下,也许自己可以回答问题。

尝试进入

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

进入您的

irb
irb 控制台并查看输出,应该清楚
%
的作用。

你真的应该看看rails api文档(1.91.8.71.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]

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?)

© www.soinside.com 2019 - 2024. All rights reserved.