Ruby範圍的.end
是用於指定範圍的結束的數字,不管範圍是否「排除」結束。我不明白這個設計決定的基本原理,但從來沒有少,我想知道什麼是最習慣的機制是確定範圍的「有效結束」(即最大整數n
,使得range.include?(n)
是true
。唯一的機制我所知道的是last(1)[0]
,這似乎很klunky如何找到範圍的「有效」結束?
回答
使用Range#max
方法:
r = 1...10
r.end
# => 10
r.max
# => 9
max
不會獨佔範圍內工作,如果任何端點是Float
(見range_max
在range.c
瞭解詳細信息) :
(1.0...10.0).max
# TypeError: cannot exclude non Integer end value
(1.0..10.0).max
# => 10.0
作爲例外,如果begin > end
,不會引發錯誤和nil
返回:
(2.0...1.0).max
# => nil
更新:在costant時間max
適用於任何包含的範圍和整數的獨家範圍,它分別返回與end
和end-1
相同的值。它也是O(1)如果範圍爲begin > end
,在這種情況下返回nil
。 對於非整數對象的範圍(String
,Date
,...)或者塊通過時,它會調用Enumerable#max
,因此它必須移動範圍內的所有元素!
Doh!謝謝。 –
隨着OP要求*整數*,我們可以將'(1.0 ... 10.0)'轉換爲**整數**版本:'r = 1.0 ... 10.0; r2 = Range.new r.begin.to_i,r.end.to_i,r.exclude_end?;'。另一方面,如果我們在'Float'中定義'pred'和'succ',我們可以在其上迭代(例如:'to_a'),所以我們可以使用'minmax',獲得第二個值,並將其轉換爲整數。所以......是的,第一種方法更簡單,更精確。 PS。我們不能使用'max',因爲它檢查*範圍*的元素是否是整數,並且僅與整數一起工作。 –
'.max'是否會傳播範圍內的所有元素? – steenslag
- 1. sed錯誤「無效的範圍結束」
- 2. powershell Get-DhcpServerv4FreeIPAddress範圍結束
- 3. 如何從swift開始到數組範圍的索引結束?
- 4. 致命錯誤:範圍結束索引沒有有效的繼任者
- 5. Sed被捕獲組的無效範圍結束錯誤
- 6. 有沒有辦法在Excel中找到範圍內的範圍?
- 7. 的Oracle SQL開始範圍結束範圍與數量
- 8. R:有效地找到正確的範圍我的值在
- 9. 設置變量結束的VBA範圍
- 10. SQL Server查找月 - 月範圍的結束日期
- 11. 爲什麼grep promt「無效範圍結束」?
- 12. 控制範圍結束非虛函數無效
- 13. SQLite rowid的有效範圍?
- 14. 有效的默認範圍
- 15. 變量的有效範圍
- 16. java.util.Date的有效範圍?
- 17. QDateTime的有效範圍:: fromMSecsSinceEpoch
- 18. 有效numpy值的範圍
- 19. 有效的vba範圍
- 20. Groovy的方式找到了一系列的有效結束
- 21. 如何找到UILabel的結束座標?
- 22. PostgreSQL:如何獲得包含結束日期的日期範圍?
- 23. 如何檢測Touchend或更改範圍值的結束?
- 24. 我如何檢查範圍的行結束?
- 25. 與範圍開始和結束
- 26. 範圍結束xldown不工作
- 27. wxpython如何找到一個wx.ListCtrl範圍
- 28. 找到的行號範圍
- 29. OSGI有效版本範圍
- 30. Java:帶有開放結束日期的日期範圍檢查
'max'是否提供所需的輸出? – zwippie
是的,它的確如此。謝謝。 –