[英]How does [*2..10] work?
要填充數組,我可以寫[*2..10]
,得到[2, 3, 4, 5, 6, 7, 8, 9, 10]
[*2..10]
[2, 3, 4, 5, 6, 7, 8, 9, 10]
。
這是如何運作的?
表達式2..10
使用..
運算符創建Range
對象。
通常, *
平數組,以便將單個對象轉換為方法的單個參數列表。 當應用於非數組對象時,它將首先嘗試通過調用to_a
將對象轉換為Array
。 因此,將*
應用於Range
首先會對其調用to_a
,這將返回位於該范圍內的值的數組。 然后將該數組通過*
平為值列表。
最后,將該值列表放在方括號[
... ]
生成一個新的Array
。 這與在Range
上調用to_a
結果相同,但是在此過程中還經過了一些額外的步驟(用*
平和[]
)。
請注意,在賦值的右側,您可以不使用方括號,無論是文字( x=1,2,3
產生的結果與x=[1,2,3]
)還是斜線( x=*2..10
產生與x=[*2..10]
相同的結果。
如果接收方是數組,則splat運算符*
將接收方的元素解壓縮到位。 如果接收方不是數組,則使用to_a
方法預先嘗試隱式類轉換。
在您的情況下,范圍2..10
不是數組,因此嘗試to_a
,因為定義了Range#to_a
,所以成功了,並給出[2, 3, 4, 5, 6, 7, 8, 9, 10]
Range#to_a
[2, 3, 4, 5, 6, 7, 8, 9, 10]
。 splat運算符在外部[]
解壓縮該數組的元素,得到[2, 3, 4, 5, 6, 7, 8, 9, 10]
。
或(1..5).to_a
。
還請記住, x..y
包含y
,但x...y
包含直到y
,即:
(1...5).to_a
產生[1,2,3,4]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.