【问题标题】:Why, in Ruby, does Array("foo\nbar") == ["foo\n", "bar"]?为什么在 Ruby 中 Array("foo\nbar") == ["foo\n", "bar"]?
【发布时间】:2010-06-12 08:03:35
【问题描述】:

在 Ruby 1.8.7 中,Array("hello\nhello") 为您提供["hello\n", "hello"]。这做了两件我没想到的事情:

  1. 它在换行符上分割字符串。我希望它只是给我一个数组,其中包含我传入的字符串作为其单个元素,而无需修改我传入的数据。

  2. 即使您接受在将字符串传递给 Array 时拆分字符串是合理的,但为什么它保留换行符而 "foo\nbar".split 不保留?

另外:

>> Array.[] "foo\nbar"
=> ["foo\nbar"]
>> Array.[] *"foo\nbar"
=> ["foo\n", "bar"]

【问题讨论】:

  • FWIW,这在 Ruby 1.9.1 中不再适用。根本没有进行拆分。
  • 是的,为了向后兼容 :) (尽管 Ruby 的政策可能是在次要版本号更改时打破它,而不是主要的。同样,任何约定都比其他约定好,总比没有好。 )
  • 我猜这是为了让你可以写Array(File.read(filename)),它会给你一个你所期望的(未压缩的)行数组。

标签: ruby arrays string


【解决方案1】:

它在换行符上分割字符串。我希望它只是给我一个数组,其中包含我传入的字符串作为其单个元素,而无需修改我传入的数据。

这是一个和其他任何约定一样好的约定。例如,Python 中的 list 构造函数做了一些完全不同的事情:

>>> list("foo")
['f', 'o', 'o']

只要它是一致的,我看不出问题。

即使您接受在将字符串传递给 Array 时拆分字符串是合理的,但为什么 "foo\nbar".split 不保留换行符?

我在这里的疯狂猜测(通过快速谷歌搜索和TryRuby 支持)是字符串的.split 方法这样做是为了使其成为数组.join 方法的“逆”操作。

>> "foospambar".split("spam").join("spam")
=> "foospambar"

顺便说一句,我无法在TryRuby 上复制你的行为:

>> x = Array("foo\nbar")                                                         
=> ["foo\nbar"]   
>> Array.[] *"foo\nbar"                                                 
=> ["foo\nbar"]   

【讨论】:

    【解决方案2】:

    如果你用单引号替换双引号,它会按预期工作:

    >> Array.[] "foo\nbar"
    => ["foo\nbar"]
    >> Array.[] 'foo\nbar'
    => ["foo\\nbar"]
    

    【讨论】:

    • 不,实际上,这意味着根本不解释换行符。
    • 这正是泰森想要的,尽管它没有回答原因。
    【解决方案3】:

    你可以试试:

    "foo\nbar".split(/w/)
    "foo\nbar".split(/^/)
    "foo\nbar".split(/$/)
    

    和其他正则表达式。

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 1970-01-01
      • 2020-10-03
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多