带上可枚举的所有项目#take

时间:2014-03-06 22:31:30

标签: 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 `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)

3 个答案:

答案 0 :(得分:1)

您可以使用Enumerable#take_while获取所有项目

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

答案 1 :(得分:1)

我们可以[0..-1]。但是使用..,您无法获得 0项而使用...时,您无法所有 。如果您无法获得0结果,请使用..,但您必须执行-1,因此0将表示所有结果

results_to_display = results[0 .. rows_to_take-1]

答案 2 :(得分:-1)

你可以投射#to_a,这将占用一切:

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

(1..4).lazy.to_a
#=> [1, 2, 3, 4]