簡體   English   中英

為什么s [n ..- 1]在紅寶石中起作用?

[英]Why does s[n..-1] work in ruby?

我是紅寶石的新手。 最近,我想從所述字符串的第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”或使用s[n..-1]之類的字符串為索引的Ruby文檔中,我也找不到任何示例,在其他官方資料中也找不到該示例。 然而,這似乎是民間文學藝術,即使手冊中沒有任何內容表明您可以使用這種方式對具有范圍的字符串建立索引,即使該范圍沒有成員,也可以獲得結果。

但是,我的朋友是正確的,它有效。

那么,有人可以向我解釋為什么這行得通嗎? 我也非常想知道它的工作原理是否是MRI / YARV的代名詞,或者絕對可以在所有Ruby實現中都可以正常工作,如果可以,它在哪里可以工作?

編輯添加:

下面的回答者聲稱,只有范圍的beginend屬性對這些目的很重要,但是我在TRPL或Ruby文檔中找不到關於該屬性的文檔。 答案還聲稱確實存在此類“混合符號”范圍索引的示例,但是我只能找到的背景是混合范圍索引顯示為nil ,而不是字符串的一部分。 因此,我沒有找到令人滿意的答案。

編輯添加:

似乎正確的答案是這確實是Ruby文檔中的缺陷。

編輯添加:

該錯誤已由Ruby文檔小組修復:請參閱https://bugs.ruby-lang.org/issues/6106

您是正確的,范圍n..-1為空。 但是,這並不重要,因為String#[]不會將范圍視為集合-它僅使用范圍的beginend屬性。

關於文件: 所述的RDoc文檔String#[]列表的行為String#[]與實施例為每個可能的類型的參數(包括與負數范圍)。 因此,您不必依賴民間傳說。 相關報價:

如果給定范圍,則返回包含字符的子字符串,該字符在該范圍給定的偏移量處。 [...]如果偏移量為負數,則從str的末尾開始計數。 [...]

 a = "hello there" # ... a[-4..-2] #=> "her" 

這是文檔中的錯誤。

自從Pickaxe的書像matz的實際上正確而全面的HTML文檔的流星一樣流傳下來以來,Ruby的文檔就變得很爛。 這個主題有時仍然讓我感到惱火。 您的問題的答案,來自1. 4鏈接

自[第n]

從數組中檢索第n個項目。 索引從零開始。 如果index為負數,則從數組末尾開始倒數。 最后一個元素的索引為-1。 如果數組中不存在第n個元素,則返回nil。

自[start..end]

返回一個數組,其中包含從頭到尾(包括兩端)的對象。 如果使用...(而不是..),則不包括end。 如果end大於數組的長度,則將其舍入為該長度。 如果start在數組范圍之外,則返回nil。 並且如果start大於end在數組范圍內,則返回空數組([])。

為了方便起見,-1是定義中數組的最后一個索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM