if counter % 2 == 1
我試圖解碼此行 - 這是一個Rails項目,我試圖找出%
確實在這個if語句的東西。%運算符在N%2的Ruby中做什麼?
回答
%
是modulo操作。 counter % 2
的結果是counter/2
的其餘部分。
n % 2
通常是確定數字n
是偶數還是奇數的好方法。如果n % 2 == 0
,數字是偶數(因爲沒有餘數意味着數字可以被2整除);如果n % 2 == 1
,該數字是奇數。
你*肯定*關於那裏的最後一個要求?這在Ruby中是正確的,但在其他語言中不是這樣! – 2010-08-18 22:47:42
@Eric什麼是不正確的?我沒有說這是確定一個數字是偶數還是奇數的唯一或最好的方法... – 2010-08-19 00:11:31
我的意思是,測試n%2 == 1 *實際上並不確定數字是否奇數*在很多語言。例如在C#中,它確定一個數字是否是正數和奇數*,這是不同的。 – 2010-08-19 15:01:38
這是模運算符。當計數器除以2時,它給出餘數。
For example:
3 % 2 == 1
2 % 2 == 0
這是模運算符,這是一種說法,它是餘數運算符的奇特方式。
所以,如果你除以二的數字,而且這個數字的整數餘數是一個,那麼你知道數爲奇數。你的例子檢查奇數。
通常這樣做是爲了突出顯示不同的背景顏色奇數行,從而更容易讀取數據的大名單。
舉幾個方式來表達:
- 模運算
- 餘運算符
- 模塊化殘留
嚴格地說,如果a % b = c
,c
是唯一的不變,使得
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的方式?)
這是一個非常基本的問題。 %
是模數運算器if counter % 2 == 1
結果爲true
爲每個奇數和false
爲每偶數。
如果你正在學習Ruby,你應該學習如何使用irb
,那裏你可以嘗試的東西出來,也許你自己回答這個問題。
嘗試進入
100.times{|i| puts "#{i} % 2 == 1 #=> #{i % 2 == 1}"}
到您的irb
IRB控制檯看到輸出,比它應該是清楚%
一樣。
而且你真的應該看看鐵軌API文檔(1.9,1.8.7,1.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]
無論它如何工作,模運算符可能不是最好的代碼(儘管我們沒有給出很多上下文)。正如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中,結果的符號(對於%
運算符)始終與第二個操作數的符號相同。
回答這個問題:「%符號在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"
+1是唯一一個提及字符串格式運算符。這是我正在尋找的特定答案。 – nocash 2014-09-04 18:13:01
- 1. 運算符|| =在Ruby中代表什麼?
- 2. | =運算符在Java中做什麼?
- 3. '/運算符在MATLAB中做什麼?
- 4. 「| =」運算符在C#中做什麼?
- 5. !==運算符在JavaScript中做什麼?
- 6. - >運算符在Perl中做什麼?
- 7. ^=運算符在Perl中做什麼?
- 8. Ruby中的「=〜」運算符是什麼?
- 9. 這個JavaScript運算符在做什麼?
- 10. =>運算符是做什麼的?
- 11. - =運算符是做什麼的?
- 12. HAML - 「!=」運算符是做什麼的?
- 13. 「+ =」運算符是做什麼的?
- 14. '&='和'=&'運算符是做什麼的?
- 15. //和||是什麼?運算符在Perl中做什麼?
- 16. 什麼是「?」。運算符在C#中做什麼?
- 17. Python中的插入符號運算符(^)在做什麼?
- 18. 運算符|是什麼?對boost :: la中的vec3做些什麼?
- 19. 運算符string(){some code}做什麼?
- 20. 角運算符:: - 它做什麼?
- 21. 4.to_s(2)中的整數2在Ruby中做了什麼?
- 22. '|| ='操作符在ruby中做了什麼?
- 23. ruby中的類名之前的符號/運算符是什麼?
- 24. 在提供的C#代碼中,+ =運算符是做什麼的?
- 25. 在Java中,箭頭運算符' - >'是做什麼的?
- 26. 在C#中```運算符是做什麼的?
- 27. 在Ruby中做什麼==?
- 28. 「|| =」在Ruby 1.9.2中做什麼?
- 29. set_if_nil.call在ruby中做什麼?
- 30. 在Ruby中,「和」,「或」運算符有什麼智慧嗎?
聞起來像是要檢查計數器的奇數值。 – 2010-08-18 22:28:24
給你一個小小的謎題:在C#中,你給的測試不會*可靠地檢查計數器是否奇怪。有沒有人看到爲什麼?(提示:在Ruby中,數字的餘數和模數方法有什麼區別?) – 2010-08-18 22:46:57
也可用於字符串替換 - http://ruby-doc.org/core/classes/String.html#M000770 – 2010-08-18 22:48:23