使用`?`(问号)在Ruby中获取ASCII字符代码失败

57

我需要获取一个字符的ASCII码(在Project Euler问题#22中有特定要求),但我遇到了问题。

作为ruby新手,我查找了相关资料,发现使用?可以实现:例如?A。但是当我将其应用到我的代码中后,语句的结果却是字符串"A"而非字符编码。使用[0]或者slice(0)同样会出现这个问题,理论上它们都能返回ASCII码。

唯一可能考虑的原因是版本问题。我正在使用1.9.1-p0,下午刚从1.8.6升级过来。我从一个工作的Ruby版本中偷了点懒,认为我可能已经拥有不随.zip文件捆绑的文件,所以没有下载它们。

那么为什么我的所有ASCII码都变成了实际的字符呢?

6个回答

78

在Ruby 1.9之前,字符处理存在一些不一致性。例如,?a"a"[0]将返回一个表示字符的ASCII值的整数(这通常不是人们想要的行为),但在实际使用中,字符通常用一个字符的字符串来表示。在Ruby 1.9中,字符不会神秘地变成整数。如果要获取字符的ASCII值,可以使用ord方法,例如:?a.ord(返回97)。


只是为了完整起见,版本1.9.3或更高版本在字母前不需要'?'符号,我们可以通过以下方式获取整数值:a.ord。 - yat0
5
@polska:我认为你可能误解了。问号'?'表示我们要字符'a',因此写?a.ord会得到97,而仅仅写a.ord会查找名为a的变量或方法,并在没有该名称或变量a不包含字符串时抛出NameError或NoMethodError异常。 - Chuck
2
是的,你说得对。我误解了。它可以使用 ?a.ord 或 "a".ord。 - yat0

39

怎么样呢?

"a"[0].ord

为了实现1.8/1.9的可移植性。


16

Ruby编程/ASCII

在 Ruby 1.9 之前的版本中,您可以使用问号语法。

?a

在1.9版本后,我们使用ord代替。

'a'.ord    

12

适用于1.8和1.9版本。

?a.class == String ? ?a.ord : ?a
或者
"a".class == String ? "a".ord : "a"[0]

1
这个在1.8.7上会报错:>> "a".class == String ? "a".ord : "a"[0] 会产生错误 NoMethodError: undefined method \ord' for "a":String from (irb):3`。 - Dolan Antenucci

8
发现了解决方案。 "string".ord 返回 s 的 ASCII 码。看起来我找到的方法在 Ruby 1.9 系列中已经失效了。

1
最好编辑您的原始帖子,而不是发布一个单独的回复来回答自己的问题。 - pierrotlefou
7
@pierr - 但这是对问题的回答,而不仅仅是问题的更新。 - rampion
5
方法并没有出现问题。正如Chuck所解释的那样,Ruby 1.9以不同的方式定义它们的行为。 - Telemachus
是的,“broken” 这个词用得不对。根据以前的版本,它们不再像我所期望的那样工作了。 新的用法才是我最初期望它们做的,并且更有意义。 - dorr

-3
如果你再次阅读项目欧拉的问题22,你会发现你不是在寻找字符的ASCII值。问题所要求的是,例如字符“A”的位置在字母表中是1,而“A”的ASCII值为65。

1
当然,您可以通过从大写字母的ASCII值中减去64来获得其在字母表中的位置。这个答案应该是一个注释。 - Nils Luxton
@NilsLuxton,也许这应该是一条评论,但它是更好的答案,符合实际问题的要求。如果您阅读所提到的Project Euler问题,ACSII值并不是他们正在寻找的。不应该被投下反对票。 - Schechter
2
问题是“如何获取字符的ASCII值”,而不是“有人能澄清欧拉计划中的#22吗”。提到手头的问题只是上下文。他们的解决方案很可能涉及先找到ASCII值,然后从那个点开始计算。我相信OP感谢您的澄清,但就目前而言,这不是他们提出的问题的答案。我可能对规则有点严格(并且是S.O.新手),但如果这个答案是评论,我会给它点赞。 - Nils Luxton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接