【问题标题】:Why does "?b" mean 'b' in Ruby?为什么“?b”在Ruby中表示“b”?
【发布时间】:2009-03-18 01:02:34
【问题描述】:
"foo"[0] = ?b # "boo"

我正在查看上面的示例并试图弄清楚:

  1. “?b”如何暗示字符“b”?
  2. 为什么有必要? - 我不能写这个吗:

    "foo"[0] = 'b' # "嘘"

【问题讨论】:

    标签: ruby string


    【解决方案1】:

    埃德·斯旺仁:?返回 a 的字符代码 字符。

    Ruby 1.9 中没有。从 1.9 开始,?a 返回“a”。见这里:Son of 10 things to be aware of in Ruby 1.9!

    telemachus ~ $ ~/bin/ruby -v
    ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-linux]
    telemachus ~ $ ~/bin/ruby -e 'char = ?a; puts char'
    a
    telemachus ~ $ /usr/bin/ruby -v
    ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
    telemachus ~ $ /usr/bin/ruby -e 'char = ?a; puts char'
    97
    

    编辑:changes in Ruby 1.9非常完整描述。

    另一个编辑:请注意,如果您希望通过?a 在 1.8 中获得字符串到数字的转换,现在可以使用 'a'.ord

    【讨论】:

    • 有什么理由我不会只说 'a' 而不是 '?a' 吗?
    • 感谢 irb 示例。文章也指出了这一点。所以在 1.9 中,?a 给了你字符 'a'。获得“a”不是一种不寻常且不必要的复杂语法。为什么不只是:'a'?
    • 好的,所以少写一个字符?a也许就是这个原因?
    • 我不认为做出改变是为了让分配更容易。也就是说,旧的行为很方便,我想不出新版本有很大帮助的好案例。也许其他人会给我们一个聪明的例子。
    • 需要注意的重要一点 - String#[] 也发生了变化,所以上面的代码在 1.8 和 1.9 中会产生相同的效果
    【解决方案2】:

    此更改与 Ruby 1.9 的 UTF-8 更新有关。

    ? 的 Ruby 1.8 版本仅适用于单字节字符。在 1.9 中,他们更新了所有内容以使用多字节字符。问题是,不清楚应该从?€ 返回什么整数。

    他们通过更改返回的内容来解决它。在 1.9 中,以下都是单元素字符串并且是等价的:

    ?€
    '€'
    "€"
    "\u20AC"
    ?\u20AC
    

    他们应该放弃符号 IMO,而不是(有点随机地)改变行为。不过,它甚至没有被正式弃用。

    【讨论】:

      【解决方案3】:

      ?返回字符的字符代码。 Here is a relevant post on this.

      【讨论】:

        【解决方案4】:

        在某些语言(Pascal、Python)中,不存在字符:它们只是长度为 1 的字符串。

        在其他语言(C、Lisp)中,存在字符并且具有不同的语法,例如 'x' 或 #\x。

        Ruby 大部分时间都支持“字符不存在”,但有时似乎并不能完全确定这种选择。如果您确实希望将 chars 作为数据类型,Ruby 已经为 '' 和 "" 赋予了含义,因此 ?x 似乎与 char 文字的任何其他选项一样合理。

        对我来说,这只是说出你的意思的问题。您也可以说 foo[0]=98,但是当您真正指的是一个字符时,您使用的是整数。当你的意思是一个字符对我来说看起来同样奇怪时使用字符串:它们支持的操作集几乎完全不同。一个是另一个的序列。您不会让 Math.sqrt 获取数字列表,而只是碰巧只查看第一个数字。您不会因为已经支持“整数列表”而从语言中省略“整数”。

        (实际上,Lisp 1.0 就是这样做的——教堂数字代表一切!——但性能非常糟糕,所以这是 Lisp 1.5 的巨大进步之一,它可以在 1962 年用作真正的语言。)

        【讨论】:

          猜你喜欢
          • 2021-10-06
          • 1970-01-01
          • 2014-09-14
          • 2020-02-04
          • 1970-01-01
          • 2014-03-29
          • 2010-12-08
          • 1970-01-01
          • 2011-05-30
          相关资源
          最近更新 更多