Ruby:范围还是序列?

Ruby: Ranges or Sequences?

我有一个关于 ruby 范围的问题:

rng = (1..10)
rng.include? 2.17 # => true (rng it's a real range)
rng.each { |num| puts num } # => prints integers between 0 and 11 (rng it's sequences)

Ruby 中的范围是什么?序列还是真实范围? 我所说的真实范围是指两个数字之间的每个数字。

混淆源于 Ruby 有两种类型的范围,它们的处理方式略有不同:数字范围,以数字对象作为端点,以及 非数字范围,以非数字对象作为端点。

Range#include? 的文档指出,"Returns true if obj is an element of the range, false otherwise. If begin and end are numeric, comparison is done according to the magnitude of the values."。因此,

(1..10).include? 2.17 #=> true

并不意味着 2.17 是范围的一个元素,只是 2.17.between?(1, 10) #=> true.

您的观点是文档的第一句话对于数字范围来说是不准确的——或者充其量是误导性的。毕竟,如果我们写

(1..10).any? { |n| n == 2.17 } #=> false

2.17 是 "an element of the range" 是什么意思?这不是非数字范围的问题。

我认为 Range#include? 的文档应该更准确。首先,在先前定义了 numericnon-numeric 范围之后,定义 member or element of a non-numeric range: "For a non-numeric range r, obj is a member of r当且仅当 r.any? { |o| o == obj } #=> true。我认为没有理由尝试为数字范围定义 member

Range#include? 可能会记录如下:"A numeric range r returns true if r.begin <= obj <= r.end for two-dot ranges and r.begin <= obj < r.end for three-dot ranges; else returns false. A non-numeric range returns true if obj is a member of the range; else false."