Ruby 获取可枚举的所有项目#获取

Ruby 获取可枚举的所有项目#获取,ruby,enumerable,Ruby,Enumerable,我怎样才能列举所有的东西 arr = [1, 2, 3] # Works arr.take(1) # Gives RangeError: float Inf out of range of integer arr.take(Float::INFINITY) # Gives RangeError: float Inf out of range of integer arr.take(1.0/0.0) # RangeError: bignum too big to convert into `lon

我怎样才能列举所有的东西

arr = [1, 2, 3]
# Works
arr.take(1)
# Gives RangeError: float Inf out of range of integer
arr.take(Float::INFINITY)
# Gives RangeError: float Inf out of range of integer
arr.take(1.0/0.0)
# RangeError: bignum too big to convert into `long'
arr.take(1000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000)
# TypeError: no implicit conversion from nil to integer
arr.take(nil)
如果无法使用可枚举的#take获取所有项目,那么我必须在
显示结果中使用卷积代码,允许所有对象
,而不是在
显示结果
中使用简单代码

MAX_ROWS = 1

# Simple code: Only two lines long.    
def display_results(results)
  results_to_display = results.take(MAX_ROWS)
  puts results_to_display.map{|result| result.join("\t")}.join("\n")
end

results = [["Foo", 1], ["Bar", 2], ["Baz", 3]]

display_results(results)

NEW_MAX_ROWS = Float::INFINITY

# Convoluted mess: six lines long
def display_results_allowing_all_objects(results)
  results_to_display = if NEW_MAX_ROWS == Float::INFINITY
                         results
                       else
                         results_to_display = results.take(NEW_MAX_ROWS)
                       end
  puts results_to_display.map{|result| result.join("\t")}.join("\n")
end

display_results_allowing_all_objects(results)
您可以将
#转换为_a
,这将带走一切:

arr = [1, 2, 3]
arr.to_a
#=> [1, 2, 3]

(1..4).lazy.to_a
#=> [1, 2, 3, 4]
您可以使用获取所有项目

$> arr.take_while { true }
 # => [1, 2, 3]

我们可以执行
[0..-1]
。但是使用
无法获取0个项目,而使用
无法获取所有项目。如果您可以处理无法获得0结果的问题,请使用
,但您必须执行
-1
,因此
0
将表示所有结果:


执行
arr.take(arr.size)
。。我有没有收到你的问题(@ArupRakshit这很管用,但应该有更好的方法。
enumerable#take
只将整数作为参数。..I blv..你认为为什么一定要有更好的方法?
take
ing一切实际上都只是调用
到a
。该方法的MRI源返回
rb_ary_subseq(obj,0,len)
。它只是创建了一个子数组,从0到
len
,因此Arup的答案是正确的。我有点困惑。不是
arr.take_all==arr
?为什么需要这个?这不允许我选择获取有限数量的项目,或者获取所有项目。所以,当您需要全部项目时,请使用
获取所有项目,或者
take
否则呢?此外,你的问题只是问如何对待一切。
results_to_display = results[0 .. rows_to_take-1]