ruby - 为什么 s[n..-1] 在 ruby​​ 中可以工作?

标签 ruby

我对 ruby 还很陌生。最近,我想提取一个字符串的一部分,从该字符串的第 n 个字符到末尾。

做像 s[n,(s.size - n)] 这样的事情对我来说似乎很不优雅,所以我问了几个 friend 。

有人建议我尝试 s[n..-1],果然有效,但他无法给我一个很好的理由说明为什么它应该有效。我发现它的工作原理相当令人费解,正如 irb1.9 的以下输出应该解释的那样:


> s = "0123456789"
=> "0123456789"
> s[2..-1]
=> "23456789"
> (2..-1).to_a
=> []

正如您所看到的,范围对象 2..-1 是空的——它没有成员,如果您将值从 2 增加到 -1,这绝对是您所期望的。这与范围对象应如何工作的文档一致。

使用范围索引字符串的文档明确指出:“如果给定一个范围,则返回包含该范围给定偏移量处的字符的子字符串”——但这是一个空集。

我在“Ruby 编程语言”或 Ruby 文档中也找不到使用 s[n..-1] 等对字符串进行索引的示例,并且可以找到其他官方来源中没有这样的例子。然而,这似乎是民间传说,尽管手册中没有任何内容表明您可以通过这种方式对带有范围的字符串进行索引,并且即使该范围没有成员也可以获得结果。

然而,我的 friend 是对的,它有效。

那么,有人可以解释一下为什么这对我有用吗?我也非常想知道它的工作是否是 MRI/YARV 的侥幸,或者这是否绝对可以在所有 Ruby 实现中工作,如果是这样,它的工作记录在哪里?

编辑添加:

下面的回答者声称只有范围的 beginend 属性对于这些目的很重要,但我在 TRPL 或 Ruby 文档中找不到任何相关文档。答案还声称确实存在这种“混合符号”范围索引的示例,但我能找到的唯一一个是在混合范围索引显示产生 nil 的上下文中,而不是字符串的一部分。因此,我认为这个答案并不令人满意。

编辑添加:

看来正确的答案是这确实是 Ruby 文档中的一个缺陷。

编辑添加:

Ruby 文档团队修复了该错误:请参阅 https://bugs.ruby-lang.org/issues/6106

最佳答案

这是文档中的错误。

自从 Pickaxe 书像 meteor 一样落在 matz 的实际上正确且全面的 HTML 文档上之后,Ruby 的文档就变得很糟糕。这个话题有时仍然让我感到恼火。您的问题的答案,从 1.4: link

self[nth]

Retrieves the nth item from an array. Index starts from zero. If index is the negative, counts backward from the end of the array. The index of the last element is -1. Returns nil, if the nth element is not exist in the array.

self[start..end]

Returns an array containing the objects from start to end, including both ends. If ... is used (instead of ..), then end is not included. if end is larger than the length of the array, it will be rounded to the length. If start is out of an array range , returns nil. And if start is larger than end with in array range, returns empty array ([]).

为了方便起见,-1 根据定义是数组的最后一个索引。

关于ruby - 为什么 s[n..-1] 在 ruby​​ 中可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521087/

相关文章:

ruby-on-rails - 显示复选框 best_in_place ruby​​ gem

ruby - 使用 Ruby 添加和信任证书到默认 OS X 钥匙串(keychain)

ruby - 为什么 Object 这个类响应定义在它上面的实例方法?

ruby - 将用户表从 Laravel 迁移到 Ruby 并使用 BCrypt 解码密码不起作用

ruby - 持久命令行显示

ruby - 在 Ruby 中制作一个方形乘法表

javascript - 如何在循环外的javascript中使用循环变量?

ruby-on-rails - Rails 中的外键问题

ruby - 如何在 rspec 示例中删除全局日志记录功能

ruby - 如何从字符串中删除单引号,只留下单词?