split dates array with take_while does not work ?

I wonder why ruby core method ‘take_while’ does not work as expected in the below Rails console example:

irb(main):003:0> arr = => irb(main):004:0> arr << Date.today - 15.days => [Sun, 27 Jan 2013] irb(main):005:0> arr << Date.today - 25.days => [Sun, 27 Jan 2013, Thu, 17 Jan 2013] irb(main):006:0> arr << Date.today => [Sun, 27 Jan 2013, Thu, 17 Jan 2013, Mon, 11 Feb 2013] irb(main):007:0> arr << Date.today + 10.days => [Sun, 27 Jan 2013, Thu, 17 Jan 2013, Mon, 11 Feb 2013, Thu, 21 Feb 2013] irb(main):008:0> arr << Date.today + 25.days => [Sun, 27 Jan 2013, Thu, 17 Jan 2013, Mon, 11 Feb 2013, Thu, 21 Feb 2013, Fri, 08 Mar 2013] irb(main):009:0> arr << Date.today + 35.days => [Sun, 27 Jan 2013, Thu, 17 Jan 2013, Mon, 11 Feb 2013, Thu, 21 Feb 2013, Fri, 08 Mar 2013, Mon, 18 Mar 2013] irb(main):010:0> arr.size => 6 irb(main):011:0> jan = arr.take_while {|d| d.month == 1 } => [Sun, 27 Jan 2013, Thu, 17 Jan 2013] irb(main):012:0> feb = arr.take_while {|d| d.month == 2 } => So, as you see, the first array that should contain January date only worked fine, but not the second one, or February dates; Any idea? Thanks and regards

Enumerable#take_while short-circuits on nil or false, hence the while in it's name. Use Enumerable#select

I wonder why ruby core method ‘take_while’ does not work as expected in the

below Rails console example:

irb(main):003:0> arr =

=>

Yep, exact, ‘select’ works as needed. By the way, is there a way (I find no method neither in Rails API for Array nor in Ruby core library, to split an array in sub-arrays by month ? Thanks

date_array.chunk { |v| v.month }.map { |v| v.last }

I wonder why ruby core method ‘take_while’ does not work as expected in

the

below Rails console example:

irb(main):003:0> arr =

=>

Yep, exact, ‘select’ works as needed. By the way, is there a way (I find no

method neither in Rails API for Array nor in Ruby core library, to split an

array in sub-arrays by month ?

Thank ou again, it worked. I fiund another way to do that with group_by method:

arr.group_by(&:month)

the only difference will be that the result will be a hash and not an array.

Regards

You can also use group_by to turn it into a hash with the month as the key.