Was ist das Gegenteil von chr () in Ruby?
Frage
In vielen Sprachen gibt es ein paar Funktionen, chr()
und ord()
, die zwischen Zahlen und Zeichenwerten zu konvertieren. In einigen Sprachen ord()
wird asc()
genannt.
Ruby hat Integer#chr
, die großen Werke:
>> 65.chr
A
Fair enough. Aber wie gehen Sie in die andere Richtung?
"A".each_byte do |byte|
puts byte
end
druckt:
65
und das ist ziemlich nahe, was ich will. Aber ich würde wirklich eher eine Schleife vermeiden. - Ich bin auf der Suche nach etwas kurz genug, um lesbar zu sein, wenn eine const
erklärt
Lösung
Wenn String # ord nicht in 1.9 vorhanden ist, tut es in 2.0:
"A".ord #=> 65
Andere Tipps
In Ruby bis einschließlich der 1,8-Serie, die folgenden werden beide produzieren 65 (für ASCII):
puts ?A
'A'[0]
Das Verhalten hat in Ruby 1.9 geändert, die beide der oben produzieren „A“ statt. Der richtige Weg, dies in Ruby zu tun 1.9 ist:
'A'[0].ord
Leider ist die ord
Methode existiert nicht in Ruby 1.8.
Versuchen:
'A'.unpack('c')
Ich möchte +1 dylanfm und AShelly Kommentar aber fügen Sie die [0]:
'A'.unpack('C')[0]
Der auspacken Aufruf gibt ein Array eine einzelne ganze Zahl enthält, die nicht immer akzeptiert wird, wo eine ganze Zahl gesucht:
$ 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 $
Ich versuche, Code zu schreiben, der auf Rubin arbeitet 1.8.1, 1.8.7 und 1.9.2.
Herausgegeben C passieren in Groß auspacken, weil auspacken ( "c") gibt mir -1 wo ord () me 255 gibt (trotz läuft auf einer Plattform, wo C die char unterzeichnet wird).
kam gerade über diesen während der Zusammenstellung eine reine Ruby-Version von Stringprep über RFCs.
Beachten Sie, dass chr
nicht außerhalb [0255], statt 1.9.x verwenden - 2.1.x tragbaren Ersatz:
[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)>
Wenn Sie darüber hinaus die Zeichen in einer Zeichenkette haben, und Sie wollen, sie entschlüsseln, ohne eine Schleife:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
Wie wäre es
puts? A
Wenn Sie nichts dagegen haben die Werte aus einem Array ziehen, können Sie "A".bytes
verwenden
Sie können diese haben:
65.chr.ord
'a'.ord.chr
Ich schreibe Code für 1.8.6 und 1.9.3 und ich konnte keine dieser Lösungen erhalten in beiden Umgebungen zu arbeiten: (
Allerdings stieß ich auf eine andere Lösung: http://smajnr.net /2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Das ist nicht für mich entweder nicht funktioniert, aber ich passte es für meine Verwendung:
unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end
Nachdem das getan, dann wird folgende in beiden Umgebungen arbeiten
'A'[0].ord