【发布时间】:2014-06-13 15:09:02
【问题描述】:
我怎样才能枚举#take 所有的东西?
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)
如果不可能使用 Enumerable#take 获取所有项目,那么我必须在 display_results_allowing_all_objects 中使用复杂的代码,而不是在 display_results 中使用简单的代码。
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)
【问题讨论】:
-
做
arr.take(arr.size).. 我有没有得到你的问题? :( -
@ArupRakshit 可以,但应该有更好的方法。
-
enumerable#take只接受整数作为参数..I blv.. -
您为什么认为必须有更好的方法?
Takeing 一切实际上只是调用to_a就可以了。该方法的 MRI 源返回rb_ary_subseq(obj, 0, len)。它只是创建了一个从0到len的子数组,所以Arup的答案是正确的。 -
我有点困惑。不是
arr.take_all == arr吗?你为什么需要这个?
标签: ruby enumerable