0

很简单地说,当我尝试将整数插入方法中,然后将其转换为字符串,并将第一个字符打印到字符串中时,我得到 [0] 插槽中的数字 + 48。没有失败,我得到slot + 48。我非常困惑,因为我相信我应该得到那个 slot 中的数字。例子:

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的十进制值为 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。或者,如果您坚持使用 Ruby < 1.9,请number[0, 1]使用number[0].

于 2013-05-12T08:58:26.263 回答
0

这是因为在 Ruby 1.8 中,String#[]返回该位置的字符的代码,例如50的 ASCII 代码2

于 2013-05-12T09:00:28.990 回答