ما هو عكس مركز حقوق الإنسان () في روبي؟

StackOverflow https://stackoverflow.com/questions/308749

  •  08-07-2019
  •  | 
  •  

سؤال

في العديد من اللغات هناك زوج من الوظائف، chr() وord()، التي تحول بين الأرقام والقيم الشخصية. في بعض اللغات، ويسمى ord() asc().

وروبي لديها Integer#chr، الذي يعمل كبيرة:

>> 65.chr
A

وعادلة بما فيه الكفاية. ولكن كيف يمكنك أن تذهب في الاتجاه الآخر؟

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

والمطبوعات:

65

وهذا قريب جدا إلى ما أريد. ولكن كنت حقا بدلا تجنب حلقة - أنا أبحث عن شيء قصيرة بما فيه الكفاية لتكون قابلة للقراءة عند إعلان const

هل كانت مفيدة؟

المحلول

إذا لم سلسلة # أورد موجودة في 1.9، فإنه في 2.0:

"A".ord #=> 65

نصائح أخرى

في روبي وبما يصل إلى سلسلة 1.8، وفيما يلي سوف كلا تنتج 65 (لASCII):

puts ?A
'A'[0]

ولقد تغير السلوك في روبي 1.9، سواء ما سبق سوف تنتج "A" بدلا من ذلك. الطريقة الصحيحة للقيام بذلك في روبي 1.9 هي:

'A'[0].ord

للأسف، لا توجد طريقة ord في روبي 1.8.

وجرب:

'A'.unpack('c')

وأود أن +1 dylanfm والتعليق AShelly ولكن إضافة [0]:

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

والدعوة فك بإرجاع صفيف يحتوي على عدد صحيح واحد، والتي لا تقبل دائما حيث يريد عدد صحيح:

$ ruby -e 'printf("0x%02X\n", "A".unpack("C"))'
-e:1:in `printf': can't convert Array into Integer (TypeError)
    from -e:1
$ ruby -e 'printf("0x%02X\n", "A".unpack("C")[0])'
0x41
$ 

وأنا أحاول كتابة التعليمات البرمجية التي تعمل على روبي 1.8.1، 1.8.7 و 1.9.2.

وقام لتمرير C إلى فك في الكبيرة، لأن فك ( "ج") يعطيني -1 حيث أورد () يعطيني 255 (على الرغم من يعمل على منصة حيث تم توقيع شار C ل).

وجاء للتو عبر هذا بينما يضع معا نسخة روبي نقية من Stringprep عبر المراجع.

وحذار فشل أن 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)>

وبالإضافة إلى ذلك، إذا كان لديك حرف في سلسلة وتريد فك دون حلقة:

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

وماذا عن

<اقتباس فقرة>   

ويضع؟ A

إذا كنت لا تمانع في سحب القيم من صفيف، يمكنك استخدام "A".bytes

هل يمكن أن يكون التالية:

65.chr.ord
'a'.ord.chr

وأنا أكتب رمز 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top