0

簡単に言えば、整数をメソッドに挿入して文字列に変換し、最初の文字を文字列に出力しようとすると、[0] スロット + 48 の数値が得られます。スロット + 48。そのスロットで番号を取得する必要があると信じているため、非常に困惑しています。例:

def print_number(num)
  number = num.to_s
  print number[0]
end

必ず x + 48 を受け取ります。

print_number(2) #=> 50 (Believe I should get 2)
print_number(5) #=> 53 (Believe I should get 5)
print_number(123) #=> 49 (Believe I should get 4)
print_number(42) #=> 52 (Believe I should get 5)
print_number(22) #=> 50 (Believe I should get 5)
print_number(1) #=> 49 (Believe I should get 5)

なんで?

4

3 に答える 3

1

あなたのように文字列にアクセスする場合、Ruby 1.8 と Ruby 1.9 では違いがあります。Ruby 1.9 では、文字列のエンコーディングに関係なく、最初の文字を取得します (たとえば、UTF-8 を使用する場合、複数のバイトで構成される可能性があります)。

Ruby 1.8 はエンコーディングに対応していないため、string[0]常に文字列の最初のバイトの表現 (この場合は最初のバイトの数値) を返します。ASCII テーブルを見ると、文字1の 10 進値が 49 であることがわかります。

Ruby 1.8 を使用している場合は、次のバリアントのいずれかを使用できます。

"123".chars.to_a[0]
# or
"123".chars.first
# or
"123"[0, 1]
于 2013-05-12T09:02:02.870 に答える
0

Ruby < 1.9 を使用していると思います。それがその中での振る舞いです。期待どおりの結果を得たい場合は、Ruby >= 1.9 にアップグレードしてください。または、1.9 未満の Ruby を使用することに固執する場合は、number[0, 1]代わりにnumber[0].

于 2013-05-12T08:58:26.263 に答える
0

これは、Ruby 1.8 では、その位置にある文字のコードをString#[]返すためです。たとえば、は の ASCII コードです。502

于 2013-05-12T09:00:28.990 に答える