【问题标题】:Yield something when random block of calculations passed当随机计算块通过时产生一些东西
【发布时间】:2014-02-27 09:29:17
【问题描述】:

我不明白的部分是如何使这个产生,以便数组中的元素在将它们添加在一起之前对它们进行计算(在块中指定),对它们进行 if block_given?

例如,计算可能是|x| x+3(将每个元素加 3),但我希望它适用于任何类型的元素操作,例如 |x| x**3|x| x*5,所以my_ary ([1,2,3]) 中的元素按照计算指定的方式更改。

所以本质上我是在问我需要对我的代码中读取 yield array.each{|x|} if block_given? 的部分做些什么。我在这里尝试做的是说数组中的每个元素都应该对元素执行块中声明的任何内容,以便对其进行更改。

我传递给 this 的内容类似于 my_ary.sum(2) {|x| x **4}

class MyArray
  attr_reader :ary

  def init(ary)
    @ary = ary
  end

  def sum(init_val = 0)
    yield ary.each{|x|} if block_given? 
    (@ary.inject(0){|x,y|x+y}) + init_val 
  end
end

【问题讨论】:

  • 请改进您的问题。不清楚你在说什么。
  • 嗨,sawa,这更清楚了吗?
  • 第一个end 指的是什么?看起来您正在尝试将大括号表示法与ifdo...end 结合起来,但没有do。您是否尝试将块传递给 sum 方法?如果是这样,你不应该做一些更像def sum(init_val = 0, &block)的事情吗?
  • 不要在 cmets 中发布您的代码,编辑您的问题以获得完整的代码示例。
  • 使用@sawa@,公平地说,我记得它叫做通知)。没有这个,sawa 将不会收到有关您的评论的通知,但我可能是错的。嗯,我很困惑你在问什么。 我认为你想要:arr=[1,2,3],然后应用方法sumarr.sum(10){|x| x+4}。 1.[1+4, 2+4, 3+4](将x+4应用于数组的所有元素)。然后对所有元素求和:1+4+2+4+3+4=18。最后加上 10(18+10)。我对吗?附言。你的第一次编辑更好。

标签: ruby block yield


【解决方案1】:
class MyArray
  attr_reader :ary

  def initialize(ary)
    @ary = ary
  end
  def sum n, &block
    new_ary = @ary.collect &block # ary after executing block
    ary_sum = new_ary.inject(0){|sum, x| sum+=x} # sum all elements of the array
    return ary_sum + n 
  end
end

def nsum n, &block,这里是& 保存块({}do; end 之间的代码)到Proc 的实例。它基本上是将您的代码块保存到变量中。

@ary.collect &block 在这里,collect 想要 block 而不是 proc 所以 &proc 更改为 blockcollect 对每个元素执行块,并返回新数组。

inject - 将元素生成到块中,将其添加到sum,并作为sum 变量返回。在下一次迭代(下一次让步到块)sum 将是上一次迭代的最后一个值。

[1,2,3].inject(0){|s, x| s+=x} 
# sum = 0; x = 1;
# sum = 1; x = 2
# sum = 3; x = 3
# sum = 6 
# inject returns 6 because there is no elements in the array

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 2011-12-09
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多