使用 `?`(问号)在 Ruby 中获取 ASCII 字符代码失败
Posted
技术标签:
【中文标题】使用 `?`(问号)在 Ruby 中获取 ASCII 字符代码失败【英文标题】:Getting an ASCII character code in Ruby using `?` (question mark) fails 【发布时间】:2010-11-19 04:54:34 【问题描述】:我现在需要一个字符的 ASCII 值(如果你想具体一点,可以使用 Project Euler question #22),我遇到了问题。
作为 ruby 的新手,我在 google 上搜索了一下,发现 ?
是要走的路:?A
或其他。但是当我将它合并到我的代码中时,该语句的结果是字符串"A"
——没有字符代码。 [0]
和 slice(0)
也有同样的问题,理论上两者都应该返回 ASCII 码。
我唯一能想到的是这是一个 ruby 版本的问题。我正在使用 1.9.1-p0,今天下午从 1.8.6 升级。我从 Ruby 的工作版本中作弊,在同一个目录中,我想我可能已经有了没有与 .zip 文件捆绑在一起的文件,所以我没有下载它们。
那么为什么我所有的 ASCII 码都变成了实际的字符呢?
【问题讨论】:
【参考方案1】:1.9 之前的 Ruby 对字符的处理有些不一致。 ?a
和 "a"[0]
将返回一个整数,表示字符的 ASCII 值(这通常不是人们正在寻找的行为),但在实际使用中,字符通常由一个字符的字符串表示。在 Ruby 1.9 中,字符永远不会神秘地变成整数。如果要获取字符的 ASCII 值,可以使用 ord
方法,如 ?a.ord
(返回 97)。
【讨论】:
只是为了完成,1.9.3 或更高版本不需要'?'在字母前签名,我们可以得到整数值:a.ord @polska:我想你可能误解了。这 ?表示我们想要字符 'a',所以写?a.ord
会得到 97,而简单地写 a.ord
会查找名为 a
的变量或方法,如果没有任何具有该名称或 a 的东西,则会抛出 NameError如果变量 a
不包含字符串,则 NoMethodError。
是的,你是对的......我误解了。它适用于 ?a.ord 或 "a".ord【参考方案2】:
怎么样
"a"[0].ord
用于 1.8/1.9 的可移植性。
【讨论】:
【参考方案3】:Ruby Programming/ASCII
在 1.9 之前的 ruby 版本中,您可以使用问号语法。
?a
1.9 之后,我们改用 ord。
'a'.ord
【讨论】:
【参考方案4】:对于 1.8 和 1.9
?a.class == String ? ?a.ord : ?a
或
"a".class == String ? "a".ord : "a"[0]
【讨论】:
这是我在 1.8.7 上的最后一个错误:>> "a".class == String ? "a".ord : "a"[0]
产生错误 NoMethodError: undefined method `ord' for "a":String from (irb):3
【参考方案5】:
找到了解决办法。 "string".ord 返回 s 的 ascii 码。 看起来我发现的方法在 1.9 系列的 ruby 中被破坏了。
【讨论】:
最好编辑您的原始帖子,而不是单独回复您自己的问题。 @pierr - 但这是对问题的回答,而不仅仅是问题的更新 方法没有被破坏。正如 Chuck 解释的那样,Ruby 1.9 对它们的行为定义不同。 是的,break 用错词了。根据以前的版本,它们不再像我预期的那样工作。新的用法是我最初期望他们做的,而且更有意义。【参考方案6】:如果您再次阅读来自项目 Euler 的问题 22,您会发现您不是在寻找字符的 ASCII 值。问题在寻找什么,例如字符“A”是 1,它在字母表中的位置,其中“A”的 ASCII 值为 65。
【讨论】:
当然,您可以通过从大写字母的 ASCII 值中减去 64 来获得字母表中的位置。这个答案应该是评论。 @NilsLuxton,也许这应该是一个评论,但这是对他们正在寻找的实际问题的更好答案。如果您阅读提到的 Project Euler 问题,那么 ACSII 值并不是他们想要的。不值得投反对票。 问题是“我如何获得字符的 ASCII 值”而不是“有人可以澄清 Project Euler 中的 #22”。提到手头的问题只是上下文。他们的解决方案很可能(并且很可能确实)涉及首先找到 ASCII 值并从该点开始计算。我相信 OP 很欣赏您的澄清,但就目前而言,这不是对他们提出的问题的回答。我可能对这里的规则有点严格(和一个 S.O. noob),但如果这个答案是评论,它会得到我的支持。以上是关于使用 `?`(问号)在 Ruby 中获取 ASCII 字符代码失败的主要内容,如果未能解决你的问题,请参考以下文章