使用 `?`(问号)在 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 字符代码失败的主要内容,如果未能解决你的问题,请参考以下文章

Ruby问号运算符,这是啥意思? [复制]

Ruby 中的独立问号有啥作用? [复制]

如何解决字符串中的问号

js怎么获取URL中问号后面的数据或其他页面提交来的数据?

python从数据库中获取utf8格式的中文数据输出时变成问号或乱码

PHP网页中获取 href 属性中跟在问号后面的部分.