रूबी में chr () के विपरीत क्या है?


100

कई भाषाओं में एक जोड़ी कार्य होता है, chr()और ord(), जो संख्याओं और वर्ण मानों के बीच परिवर्तित होते हैं। कुछ भाषाओं में, ord()कहा जाता है asc()

रूबी है Integer#chr, जो महान काम करता है:

>> 65.chr
A

काफी उचित। लेकिन आप दूसरे तरीके से कैसे जाते हैं?

"A".each_byte do |byte|
   puts byte
end

प्रिंट:

65

और जो मैं चाहता हूं, उसके बहुत करीब है। लेकिन मैं वास्तव में एक लूप से बचना चाहता हूं - जब मैं घोषणा कर रहा हूं, तो मैं पढ़ने योग्य होने के लिए कुछ कम कर रहा हूं const

जवाबों:



33

रूबी अप करने के लिए और 1.8 श्रृंखला सहित, निम्नलिखित दोनों का उत्पादन होगा 65 (ASCII के लिए):

puts ?A
'A'[0]

रूबी 1.9 में व्यवहार बदल गया है, उपरोक्त दोनों इसके बजाय "ए" का उत्पादन करेंगे। रूबी 1.9 में ऐसा करने का सही तरीका है:

'A'[0].ord

दुर्भाग्य से, ordविधि रूबी 1.8 में मौजूद नहीं है।


यह दुर्भाग्यपूर्ण है कि रूबी 1.9 में "सही" तरीका इतना लंबा है, लेकिन कम से कम यह "ऑर्ड" की खोजों में आसान दिखाएगा। आपके बहुत विस्तृत उत्तर के लिए धन्यवाद।
RJHunter

13

प्रयत्न:

'A'.unpack('c')

1
अब जब रूबी 1.9 ने 'ए' [0] का अर्थ बदल दिया है, तो यह अधिक पोर्टेबल विधि है।
एशेल्ली

10

मैं +1 dylanfm और AShelly की टिप्पणी चाहूंगा, लेकिन [0] जोड़ें:

'A'.unpack('C')[0]

अनपैक कॉल एक पूर्णांक वाला एक एरे लौटाता है, जिसे हमेशा स्वीकार नहीं किया जाता है कि एक पूर्णांक कहां है:

$ रूबी -e 'प्रिंटफ़ ("0x% 02X \ n", "ए" .unpack ("C C)")
-e: 1: `प्रिंटफ 'में: ऐरे को इंटेगर में टाइप नहीं कर सकते (TypeError)
    से -ई: १
$ रूबी -e 'प्रिंटफ़ ("0x% 02X \ n", "ए" .unpack ("C") [0])'
0x41
$ 

मैं कोड लिखने की कोशिश कर रहा हूं जो रूबी 1.8.1, 1.8.7 और 1.9.2 पर काम करता है।

अपरकेस में सी को पास करने के लिए संपादित किया गया, क्योंकि अनपैक ("सी") मुझे -1 देता है जहां ऑर्ड () मुझे 255 देता है (एक प्लेटफॉर्म पर चलने के बावजूद जहां सी के चार्ट पर हस्ताक्षर किए गए हैं)।


4

आरएफसी के माध्यम से स्ट्रिंगरपर्प के शुद्ध रूबी संस्करण को एक साथ रखने के दौरान बस इस पार आया।

खबरदार कि chrबाहर [0255] में विफल रहता है, बजाय 1.9.x का उपयोग करें - 2.1.x पोर्टेबल प्रतिस्थापन:

[22] pry(main)> "\u0221".ord.chr
RangeError: 545 out of char range
from (pry):2:in 'chr'
[23] pry(main)> x = "\u0221".unpack('U')[0]
=> 545
[24] pry(main)> [x].pack('U')
=> "ȡ"
[25] pry(main)>

धन्यवाद, यह केवल एक ही उत्तर प्रतीत होता है जो देता है charऔर यूनिकोड के मामले में इसका व्युत्क्रम सही ढंग से करता है
मुनियारी

3

इसके अतिरिक्त, यदि आपके पास तार में तार है और आप इसे बिना लूप के डिकोड करना चाहते हैं:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122



2

यदि आपको किसी ऐरे से मान खींचने में कोई दिक्कत नहीं है, तो आप उपयोग कर सकते हैं "A".bytes


0

मैं 1.8.6 और 1.9.3 के लिए कोड लिख रहा हूं और मुझे इन दोनों वातावरणों में काम करने के लिए इनमें से कोई भी समाधान नहीं मिला :(

हालाँकि, मुझे एक और समाधान मिला: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

यह मेरे लिए भी काम नहीं किया, लेकिन मैंने इसे अपने उपयोग के लिए अनुकूलित किया:

unless "".respond_to?(:ord)
  class Fixnum
    def ord
      return self
    end
  end
end

ऐसा करने के बाद, फिर दोनों वातावरण में काम करेंगे

'A'[0].ord


जब user18096 ने अपना उत्तर लिखा "A".unpack("C")[0], तो वह रूबी 1.8.1, रूबी 1.8.7 और रूबी 1.9.2 को लक्षित कर रहा था। क्या यह आपके वातावरण में विफल रहता है? कैसी असफलता?
आरजेहंटर

हाय आरजेहंटर, मैं एक विशिष्ट चरित्र को एक स्ट्रिंग में इसके संख्या मान में बदलने की कोशिश कर रहा हूं। निम्न कोड 1.9.3 में काम करता है, लेकिन 1.8.6 में नहीं। self.status = tagAccountString[4].unpack('C')[0] 1.8.6 में मुझे Exception undefined method 0 के लिए अनपैक मिलता है : फ़िक्नम प्रोसेसिंग मुख्य बफर टैग डेटा - एक्ज़िट` दोनों वातावरणों में निम्न कोड काम करता है (मेरे प्रस्तावित समाधान के साथ) self.status = tagAccountString[4].ord कोई भी सलाह (जैसे एक बेहतर समाधान) स्वागत से अधिक है
हंट्सकोलिन

tagAccountString[4]नए रूबी में एक स्ट्रिंग लौटाता है लेकिन रूबी 1.8 में एक फिक्सनम लौटाता है। तुम क्यों त्रुटि देखा कि, है undefined method unpack for 0:Fixnum। आप उपयोग status = tagAccountString[4,1].unpack('C')[0]कर सकते हैं या भले status, = tagAccountString.unpack('xxxxC')ही आप हमेशा चार वर्णों को अनदेखा करना चाहते हैं और अगले एक को परिवर्तित कर सकते हैं।
RJHunter

स्पष्टीकरण और वैकल्पिक समाधान के लिए धन्यवाद RJHunter। हालांकि, "मेरा" समाधान अधिक पठनीय और पुन: प्रयोज्य है, मैं इसके साथ रहूँगा (जब तक कि कोई अच्छा कारण भी न हो?)
हंट्सकोलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.