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?
的文档应该更准确。首先,在先前定义了 numeric 和 non-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
."
我有一个关于 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?
的文档应该更准确。首先,在先前定义了 numeric 和 non-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
."