রুবির 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 টি উত্পাদন করবে (এএসসিআইআইয়ের জন্য):

puts ?A
'A'[0]

আচরণ রুবি ১.৯-এ পরিবর্তিত হয়েছে, উপরের উভয়টি পরিবর্তে "এ" উত্পাদন করবে। রুবি ১.৯-এ এটি করার সঠিক উপায় হ'ল:

'A'[0].ord

দুর্ভাগ্যক্রমে, ordরুবি ১.৮ এ পদ্ধতিটি বিদ্যমান নেই।


এটি দুর্ভাগ্যজনক যে রুবি ১.৯-এ "সঠিক" পথটি এত দীর্ঘ, তবে কমপক্ষে এটি "অর্ড" অনুসন্ধানে আরও সহজ দেখায়। আপনার খুব বিস্তারিত উত্তরের জন্য ধন্যবাদ।
আরজেহান্টার

13

চেষ্টা করুন:

'A'.unpack('c')

4
এখন যে রুবি ১.৯ 'এ' এর অর্থ পরিবর্তন করেছে [0], এটি আরও বহনযোগ্য পদ্ধতি।
এশেলি

10

আমি +1 ডিলানফএম এবং অ্যাশেলির মন্তব্য করতে চাই তবে [0] যুক্ত করুন:

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

আনপ্যাক কলটি একটি একক পূর্ণসংখ্যাযুক্ত একটি অ্যারে প্রদান করে, যেখানে কোনও পূর্ণসংখ্যার প্রয়োজন হয় সেখানে সর্বদা গ্রহণ করা হয় না:

$ রুবি -e 'প্রিন্টফ ("0x% 02X \ n", "এ" .নপ্যাক ("সি"))'
-e: 1: in `printf ': অ্যারেটিকে পূর্ণসংখ্যায় রূপান্তর করতে পারে না (TypeError)
    থেকে -e: 1
$ রুবি -e 'প্রিন্টফ ("0x% 02X \ n", "এ" .উনপ্যাক ("সি") [0])'
0x41
$ 

আমি রুবি 1.8.1, 1.8.7 এবং 1.9.2 এ কাজ করে এমন কোডটি লেখার চেষ্টা করছি।

বড় হাতের অক্ষরে আনপ্যাক করার জন্য সি পাস করার জন্য সম্পাদনা করা হয়েছে, কারণ আনপ্যাক ("সি") আমাকে -1 দেয় যেখানে অর্ডার () আমাকে 255 দেয় (যেখানে সি এর চর স্বাক্ষরিত প্ল্যাটফর্মে চালানো সত্ত্বেও) দেয়।


4

আরএফসিগুলির মাধ্যমে স্ট্রিংপ্রেপের একটি খাঁটি রুবি সংস্করণ একসাথে রাখার সময় কেবল এটি পেরিয়ে এসেছিল।

chr[0,255] এর বাইরে ব্যর্থ হওয়া সতর্ক থাকুন , পরিবর্তে 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


যখন ব্যবহারকারী ১80০৯ their তাদের উত্তর লিখেছিল "A".unpack("C")[0], তা রুবি ১.৮.১, রুবি ১.৮..7 এবং রুবি ১.৯.২ লক্ষ্যবস্তু ছিল। এটি আপনার পরিবেশে ব্যর্থ হয়? কি ধরনের ব্যর্থতা?
আরজেহান্টার

হাই আরজেহান্টার, আমি একটি স্ট্রিংয়ের একটি নির্দিষ্ট অক্ষরকে তার সংখ্যার মানতে রূপান্তর করার চেষ্টা করছি। নিম্নলিখিত কোডটি 1.8.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]আরও নতুন রুবিগুলিতে একটি স্ট্রিং প্রদান করে তবে রুবি ১.৮ এ একটি ফিক্সনাম ফেরত ব্যবহৃত হত। এজন্য আপনি ত্রুটিটি দেখেছেন undefined method unpack for 0:Fixnum,। আপনি ব্যবহার করতে পারে status = tagAccountString[4,1].unpack('C')[0]বা এমনকি status, = tagAccountString.unpack('xxxxC')আপনি সবসময় চার অক্ষর উপেক্ষা করুন এবং পরের এক রূপান্তর করতে চান।
আরজেহান্টার

ব্যাখ্যা এবং বিকল্প সমাধানের জন্য ধন্যবাদ আর জে হুন্টার। তবে, "আমার" সমাধানটি আরও পঠনযোগ্য এবং পুনরায় ব্যবহারযোগ্য হিসাবে, আমি এটির সাথে আটকে থাকব (যদি না কোনও ভাল কারণ না থাকে তবে?)
হ্যান্টসকোলিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.