ruby - Why is my block only executed once? -
why that:
array = (1..20).to_a array.index.each_slice(5) |slice| puts slice.inspect end returns:
[1, 2, 3, 4, 5] [6, 7, 8, 9, 10] [11, 12, 13, 14, 15] [16, 17, 18, 19, 20] while:
other_array = [] array = (1..20).to_a array.index.each_slice(5) |slice| puts slice.inspect other_array.push(1) end returns only:
[1, 2, 3, 4, 5] how other_array.push(1) breaks execution of block? obvious conclusion cannot access variables not in scope of block, why that?
i found solution in array documentation. wondered why used index function array when seems want iterate on array. can use array.each_slice without invoking index. index says following: http://ruby-doc.org/core-2.2.0/array.html#method-i-index
returns index of first object in ary such object == obj.
if block given instead of argument, returns index of first object block returns true. returns nil if no match found
so code evaluates block , checks if result true. in first example puts returns nil. nil false.
second example returns object of array containing single 1.
in ruby every condition true, if not false or nil. can see here:
if nil puts "foo" end => nil other_array = [1] if other_array puts "foo" end => "foo" so block in second example returns not-false not run again, because found "valid" result.
for return, maybe should know ruby returns last expression in scope, if no other return given. returns other_array. if don't want reformat code following:
other_array = [] array = (1..20).to_a array.index.each_slice(5) |slice| puts slice.inspect other_array.push(1) nil end this force block return nil , iteration work.
Comments
Post a Comment