2010-08-18 17 views
20

if counter % 2 == 1 मैं इस लाइन को डीकोड करने की कोशिश कर रहा हूं - यह एक रेल परियोजना है और मैं यह समझने की कोशिश कर रहा हूं कि % इस कथन में क्या करता है।% ऑपरेटर रूबी में एन% 2 में क्या करता है?

+1

कुछ काउंटर की विषम मूल्यों के लिए जाँच करने के लिए की तरह खुशबू। –

+1

आपके लिए एक छोटी सी पहेली: सी # में, आपके द्वारा दिया गया परीक्षण * विश्वसनीय * जांच नहीं करता है कि काउंटर अजीब है या नहीं। क्या कोई देखता है क्यों?(संकेत: रुबी में, संख्याओं पर शेष और मॉड्यूलो विधियों के बीच क्या अंतर है?) –

+0

स्ट्रिंग प्रतिस्थापन के लिए भी उपयोग करें - http://ruby-doc.org/core/classes/String.html#M000770 –

उत्तर

40

%modulo ऑपरेटर है। counter % 2 का परिणाम counter/2 का शेष है।

n % 2 अक्सर यह निर्धारित करने का एक अच्छा तरीका है कि कोई संख्या n है या विषम है। यदि n % 2 == 0, संख्या भी है (क्योंकि कोई शेष नहीं है कि संख्या 2 तक समान रूप से विभाजित है); यदि n % 2 == 1, संख्या विषम है।

+0

आप * आखिरी दावा के बारे में * निश्चित *? रूबी में यह सच है लेकिन अन्य भाषाओं में नहीं! –

+0

@Eric क्या सच नहीं है? मैंने यह नहीं कहा कि यह निर्धारित करने का एकमात्र या सबसे अच्छा तरीका है कि कोई संख्या भी अजीब है या नहीं ... –

+0

मेरा मतलब था कि परीक्षण एन% 2 == 1 * वास्तव में यह निर्धारित नहीं करता है कि कितने संख्या में विषम * है भाषाओं। उदाहरण के लिए सी # में यह निर्धारित करता है कि कोई संख्या सकारात्मक और विषम * दोनों है, जो अलग है। –

2

सापेक्ष ऑपरेटर है कि। यह शेष जब काउंटर 2.

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

से विभाजित है यह सापेक्ष ऑपरेटर, जो यह कह शेष ऑपरेटर है का एक आधुनिक तरीका है देता है।

तो यदि आप दो से एक संख्या विभाजित करते हैं, और उस संख्या का पूर्णांक शेष एक है, तो आप जानते हैं कि संख्या विषम थी। आपका उदाहरण विषम संख्याओं के लिए जांचता है।

अक्सर यह एक अलग पृष्ठभूमि रंग के साथ अजीब संख्या पंक्तियों को हाइलाइट करने के लिए किया जाता है, जिससे डेटा की बड़ी सूचियां पढ़ने में आसानी होती है।

0

यह कहना कुछ तरीके देने के लिए:

  • modulo ऑपरेटर
  • शेष ऑपरेटर
  • मॉड्यूलर अवशेषों

सच पूछिये तो, अगर a % b = c, c ऐसी है कि अद्वितीय स्थिर है

a == c (mod b) और 0 <= c < b

कहाँ x == y (mod m) कुछ निरंतर k के लिए x - y = km iff।

यह शेष के बराबर है। कुछ प्रसिद्ध प्रमेय के अनुसार, हम है कि कुछ निरंतर k, जहां c के लिए a = bk + c शेष है, जो हमें a - c = bk देता है, जो स्पष्ट रूप से a == c (mod b) का तात्पर्य है।

(वहाँ Stackoverflow पर LaTeX उपयोग करने के लिए कोई तरीका है?)

0

यह एक बहुत ही बुनियादी सवाल है। % प्रत्येक विषम संख्या के लिए मॉड्यूलो ओपेरेटर if counter % 2 == 1 परिणाम true और प्रत्येक भी संख्या के लिए false पर परिणाम है।

यदि आप रूबी सीख रहे हैं तो आपको irb का उपयोग करना सीखना चाहिए, वहां आप चीजों को आजमा सकते हैं और शायद स्वयं को प्रश्न का उत्तर दे सकते हैं।

अपने irb आईआरबी कंसोल में

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

दर्ज करें और देखें कि उत्पादन, की तुलना में यह स्पष्ट क्या % करता होना चाहिए की कोशिश करो।

और तुम सच में रेल API दस्तावेज़ (1.9, 1.8.7, 1.8.7) पर एक नज़र रखना चाहिए, वहाँ आप पाया है | जवाब दो divmod (Numeric) का विस्तृत विवरण के लिए एक और लिंक के साथ अपने सवाल % (Fixnum):

संख्यात्मक रूप से संख्या को विभाजित करके प्राप्त अंश और मॉड्यूलस युक्त एक सरणी देता है। > यदि क्यू, आर = 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

चाहे यह कैसे काम करता है, मॉड्यूल ऑपरेटर संभवतः उद्देश्य के लिए सबसे अच्छा कोड नहीं है (भले ही हमें अधिक संदर्भ नहीं दिया गया हो)। जैसा कि जॉर्ग ने एक टिप्पणी में उल्लेख किया है, अभिव्यक्ति if counter.odd? शायद इरादा है, और अधिक पठनीय है।

यदि यह कोड देखें और पंक्ति रंगों को बदलने के लिए (उदाहरण के लिए) निर्धारित करने के लिए उपयोग किया जाता है, तो आप बिल्ट-इन रेल हेल्पर cycle() का उपयोग कर काउंटर के बिना पूरी तरह से कर सकते हैं। उदाहरण के लिए, आप cycle('odd','even') का उपयोग तालिका पंक्ति के लिए कक्षा के नाम के रूप में कर सकते हैं, काउंटर को समाप्त कर सकते हैं और आस-पास तर्क के आसपास।

एक और सोचा: अगर यह एक each ब्लॉक में है, तो each_with_index का उपयोग करें और बाहरी काउंटर चर को खत्म करने में सक्षम हो सकता है।

मेरा $ 0.02 रिफैक्टरिंग।

0

यह भी ध्यान रखें कि, मॉड्यूलो (%) ऑपरेटर की रूबी की परिभाषा सी और जावा से भिन्न होती है। रुबी में, -7%32 है। सी और जावा में, परिणाम -1 इसके बजाए है। रूबी में, परिणाम का संकेत (% ऑपरेटर के लिए) हमेशा दूसरे ऑपरेंड के संकेत के समान होता है।

37

प्रश्न के उत्तर में "रुबी में% प्रतीक क्या है या इसका मतलब क्या है?" यह है:

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

संबंधित मुद्दे