【问题标题】:Take all items with enumerable#take使用可枚举的所有项目#take
【发布时间】: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


【解决方案1】:

你可以使用Enumerable#take_while拿走所有物品

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

【讨论】:

    【解决方案2】:

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

    results_to_display = results[0 .. rows_to_take-1]
    

    【讨论】:

      【解决方案3】:

      你可以使用 #to_a 来获取所有内容:

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

      【讨论】:

      • 这不允许我选择是拿走有限数量的物品,还是拿走所有物品。
      • 那么当你想要全部时使用to_a,否则使用take
      • 此外,您的问题只是问如何采取一切。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多