2010-08-18 97 views
20

if counter % 2 == 1我試圖解碼此行 - 這是一個Rails項目,我試圖找出%確實在這個if語句的東西。%運算符在N%2的Ruby中做什麼?

+1

聞起來像是要檢查計數器的奇數值。 – 2010-08-18 22:28:24

+1

給你一個小小的謎題:在C#中,你給的測試不會*可靠地檢查計數器是否奇怪。有沒有人看到爲什麼?(提示:在Ruby中,數字的餘數和模數方法有什麼區別?) – 2010-08-18 22:46:57

+0

也可用於字符串替換 - http://ruby-doc.org/core/classes/String.html#M000770 – 2010-08-18 22:48:23

回答

40

%modulo操作。 counter % 2的結果是counter/2的其餘部分。

n % 2通常是確定數字n是偶數還是奇數的好方法。如果n % 2 == 0,數字是偶數(因爲沒有餘數意味着數字可以被2整除);如果n % 2 == 1,該數字是奇數。

+0

你*肯定*關於那裏的最後一個要求?這在Ruby中是正確的,但在其他語言中不是這樣! – 2010-08-18 22:47:42

+0

@Eric什麼是不正確的?我沒有說這是確定一個數字是偶數還是奇數的唯一或最好的方法... – 2010-08-19 00:11:31

+0

我的意思是,測試n%2 == 1 *實際上並不確定數字是否奇數*在很多語言。例如在C#中,它確定一個數字是否是正數和奇數*,這是不同的。 – 2010-08-19 15:01:38

2

這是模運算符。當計數器除以2時,它給出餘數。

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

這是模運算符,這是一種說法,它是餘數運算符的奇特方式。

所以,如果你除以二的數字,而且這個數字的整數餘數是一個,那麼你知道數爲奇數。你的例子檢查奇數。

通常這樣做是爲了突出顯示不同的背景顏色奇數行,從而更容易讀取數據的大名單。

0

舉幾個方式來表達:

  • 模運算
  • 餘運算符
  • 模塊化殘留

嚴格地說,如果a % b = cc是唯一的不變,使得

a == c (mod b) and 0 <= c < b

其中x == y (mod m) iff x - y = km對於一些常數k

這相當於其餘部分。通過一些知名的定理,我們有a = bk + c對於某一常數k,其中c是餘數,這給了我們a - c = bk,這顯然意味着a == c (mod b)

(有沒有辦法使用LaTeX的#2的方式?)

0

這是一個非常基本的問題。 %是模數運算器if counter % 2 == 1結果爲true爲每個奇數和false爲每偶數。

如果你正在學習Ruby,你應該學習如何使用irb,那裏你可以嘗試的東西出來,也許你自己回答這個問題。

嘗試進入

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

到您的irb IRB控制檯看到輸出,比它應該是清楚%一樣。

而且你真的應該看看鐵軌API文檔(1.91.8.71.8.7),那裏你會找到答案了兩次與進一步的鏈接的divmod (Numeric)詳細描述你的問題% (Fixnum)

返回一個數組,其中包含通過將num除以數字獲得的商和模數。 >如果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] 
1

無論它如何工作,模運算符可能不是最好的代碼(儘管我們沒有給出很多上下文)。正如Jörg在評論中提到的那樣,表達if counter.odd?可能是意圖,並且更具可讀性。

如果這是查看代碼並用於確定(例如)交替行顏色,那麼您可以通過使用內置的Rails幫手cycle()完全不用計數器。例如,您可以使用cycle('odd','even')作爲表格行的類名稱,從而消除計數器和周圍的if/then邏輯。

另一個想法:如果這是在each區塊內,您可以使用each_with_index並消除多餘的計數器變量。

我的重構$ 0.02。

0

另外請記住,Ruby的模的定義(%)與C和Java的定義不同。在Ruby中,-7%32。在C和Java中,結果是-1。在Ruby中,結果的符號(對於%運算符)始終與第二個操作數的符號相同。

37

回答這個問題:「%符號在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)字符串格式運算符(簡寫爲內核:: sprintf)

"05d" % 123 #=> "00123" 
+8

+1是唯一一個提及字符串格式運算符。這是我正在尋找的特定答案。 – nocash 2014-09-04 18:13:01