質問

多くの言語には、 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top