Ruby中的%操作符在N % 2中有什么作用?

cvxl0en2  于 12个月前  发布在  Ruby
关注(0)|答案(9)|浏览(155)

if counter % 2 == 1我试图解码这一行-这是一个Rails项目,我试图弄清楚%在这个if语句中做了什么。

xfb7svmp

xfb7svmp1#

%modulo运算符。counter % 2的结果是counter / 2的余数。
n % 2通常是判断一个数n是偶数还是奇数的好方法。如果n % 2 == 0,这个数是偶数(因为没有余数意味着这个数能被2整除);如果n % 2 == 1,则数字是奇数。

ttygqcqt

ttygqcqt2#

在回答“Ruby中的%符号做什么或意味着什么?“它是:
1.模二元运算符(如前所述)

17 % 10 #=> 7

1.替代字符串token

%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(.*)          #=> /.*/

1.字符串格式操作符(Kernel::sprintf的简写)

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

pgx2nnw83#

这就是模运算符。它给出计数器除以2的余数。

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

nzkunb0c4#

不管它是如何工作的,模运算符可能不是最好的代码(即使我们没有给出太多的上下文)。正如Jörg在评论中提到的,表达式if counter.odd?可能是意图,并且更具可读性。
如果这是视图代码,并且用于确定(例如)交替的行颜色,那么您可以通过使用内置的Rails助手cycle()来完全不使用计数器。例如,您可以使用cycle('odd','even')作为表行的类名,从而消除计数器和if/then逻辑。
另一个想法:如果这是在一个each块中,您可以使用each_with_index并消除无关的计数器变量。
我的重构0.02美元。

luaexgnf

luaexgnf5#

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

s4n0splo

s4n0splo7#

它是模运算符,这是一种说它是余数运算符的奇特方式。
所以如果你把一个数除以2,这个数的整数余数是1,那么你知道这个数是奇数。您的示例检查奇数。
通常这样做是为了用不同的背景颜色突出显示奇数行,使其更容易阅读大型数据列表。

vaqhlq81

vaqhlq818#

这是一个非常基本的问题。%是模运算器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(Numeric)的详细描述:
返回一个数组,该数组包含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]
carvr3hs

carvr3hs9#

给给予几种说法:

  • 模运算器
  • 余数运算符
  • 模剩余

严格地说,如果a % b = cc是唯一常数,
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)
(Is有办法在Stackoverflow上使用LaTeX吗?)

相关问题