【发布时间】:2012-03-20 05:39:12
【问题描述】:
我对红宝石还很陌生。最近想从字符串的第n个字符到结尾提取一部分字符串。
像 s[n,(s.size - n)] 这样的操作对我来说似乎很不雅,所以我问了几个朋友。
有人建议我尝试 s[n..-1],果然可行,但他无法给我一个很好的理由为什么它应该有效。我发现它的工作原理相当令人费解,正如 irb1.9 的以下输出应该解释的那样:
> s = "0123456789"
=> "0123456789"
> s[2..-1]
=> "23456789"
> (2..-1).to_a
=> []
如您所见,范围对象 2..-1 是空的——它没有成员,如果您将值从 2 上升到 -1,这绝对是您所期望的。这与范围对象应如何工作的文档一致。
使用范围索引字符串的文档清楚地说明:“如果给定范围,则返回包含范围给定偏移量处的字符的子字符串”——但这是一个空集。
我也无法在“The Ruby Programming Language”或 Ruby 文档中找到使用s[n..-1] 等对字符串进行索引的示例,并且在其他官方来源中也找不到此类示例。然而,这似乎是民间传说,即使手册中没有任何内容表明您可以通过这种方式索引具有范围的字符串,并且即使该范围没有成员,也可以获得您得到的结果。
然而,我的朋友是对的,它有效。
那么,有人可以解释一下为什么这对我有用吗?我也很想知道它的工作原理是否是 MRI/YARV 的侥幸,或者这是否绝对有望在所有 Ruby 实现中工作,如果是这样,它在哪里可以工作?
编辑添加:
下面的回答者声称只有范围的 begin 和 end 属性对这些目的很重要,但我在 TRPL 或 Ruby 文档中找不到任何文档。答案还声称确实存在这种“混合符号”范围索引的示例,但我能找到的唯一一个是在混合范围索引显示产生nil,而不是字符串切片的上下文中.因此,我觉得这个答案并不令人满意。
编辑添加:
看来正确的答案是,这确实是 Ruby 文档中的一个缺陷。
编辑添加:
该错误已由 Ruby 文档团队修复:请参阅 https://bugs.ruby-lang.org/issues/6106
【问题讨论】:
-
Array#[] 是一种方法。谷歌搜索
ruby string []或ruby string#[]将引导您找到文档作为最佳结果。 -
抱歉,没有。这是不正确的。我已经阅读了该文档。您需要更仔细地重新阅读问题。
-
a[-3,2] #=> "er" a[-4..-2] #=> "her" a[12..-1] #=> nil a[ -2..-4] #=> "" (引用自文档)
-
你又误会了。我很清楚您引用的文档部分,它不是一个反例。请在发表评论之前阅读整个讨论,包括以下所有内容。请注意,您在上面引用的唯一与文档相关的示例是
a[12..-1] #=> nil并且产生nil而不是字符串切片——文档中不存在我所说的示例,是的,我我确定。 -
+1 我以前从未想过这个。
标签: ruby