我不理解的部分是如何产生这个产量,以便数组中的元素在添加之前对它们if block_given?
进行计算(在块中指定)。一起。
例如,计算可以是|x| x+3
(为每个元素添加3),但我希望这适用于任何类型的元素操作,例如|x| x**3
或{ {1}},以便|x| x*5
(my_ary
)中的元素按计算指定的方式更改。
基本上我问我需要对我的代码中读取[1,2,3]
的部分做些什么。我在这里尝试做的是说数组中的每个元素应该具有对元素执行的块中所述的任何内容,以便它被更改。
我传给的是yield array.each{|x|} if block_given?
。
my_ary.sum(2) {|x| x **4}
答案 0 :(得分:2)
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
,此处&
将<{1}}或{}
之间的代码(do; end
或Proc
之间的代码)保存到@ary.collect &block
的实例。它基本上是保存到变量的代码块。
collect
此处,block
希望proc
不&
,proc
将block
更改为collect
。 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
将是上一次迭代的最后一个值。
{{1}}