質問
多くの言語には、 chr()
と ord()
のペアの関数があり、数値と文字値の間で変換します。一部の言語では、 ord()
は asc()
と呼ばれます。
Rubyには Integer#chr
があり、これは非常に効果的です:
>> 65.chr
A
十分です。しかし、あなたはどうやって他の方法に行くのですか?
"A".each_byte do |byte|
puts byte
end
印刷:
65
それは私が望むものにかなり近い。しかし、私は本当にループを避けたいです- const
を宣言するときに読みやすいほど短いものを探しています。
解決
String#ordが1.9に存在しなかった場合、2.0には存在します:
"A".ord #=> 65
他のヒント
1.8シリーズまでのRubyでは、次の両方で65(ASCIIの場合)が生成されます。
puts ?A
'A'[0]
Ruby 1.9では動作が変更されました。上記の両方で" A"が生成されます。代わりに。 Ruby 1.9でこれを行う正しい方法は次のとおりです。
'A'[0].ord
残念ながら、 ord
メソッドはRuby 1.8には存在しません。
試してください:
'A'.unpack('c')
dylanfmとAShellyのコメントを+1しますが、[0]を追加します:
'A'.unpack(' C ')[0]
unpack呼び出しは、単一の整数を含む配列を返しますが、整数が必要な場合は常に受け入れられるとは限りません。
$ 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 $
Ruby 1.8.1、1.8.7、および1.9.2で動作するコードを記述しようとしています。
Cを大文字でアンパックするために編集されました。これは、unpack(" c")が-1を提供するためです。
RFCを介して純粋なRubyバージョンのStringprepを作成しているときにこれに遭遇しました。
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があり、ループなしでデコードする場合:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
方法
puts?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