split dates array with take_while does not work ?

20 views
Skip to first unread message

Javix

unread,
Feb 11, 2013, 9:33:57 AM2/11/13
to rubyonra...@googlegroups.com
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

Jordon Bedwell

unread,
Feb 11, 2013, 9:46:46 AM2/11/13
to rubyonra...@googlegroups.com
On Mon, Feb 11, 2013 at 8:33 AM, Javix <s.ca...@gmail.com> wrote:
> I wonder why ruby core method 'take_while' does not work as expected in the
> below Rails console example:
>
> irb(main):003:0> arr = []
> => []

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

Javix

unread,
Feb 11, 2013, 10:15:26 AM2/11/13
to rubyonra...@googlegroups.com


On Monday, February 11, 2013 3:46:46 PM UTC+1, Jordon Bedwell wrote:
On Mon, Feb 11, 2013 at 8:33 AM, Javix <s.ca...@gmail.com> wrote:
> 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

Jordon Bedwell

unread,
Feb 11, 2013, 10:20:56 AM2/11/13
to rubyonra...@googlegroups.com
On Mon, Feb 11, 2013 at 9:15 AM, Javix <s.ca...@gmail.com> wrote:
>
>
> On Monday, February 11, 2013 3:46:46 PM UTC+1, Jordon Bedwell wrote:
>>
>> On Mon, Feb 11, 2013 at 8:33 AM, Javix <s.ca...@gmail.com> wrote:
>> > 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 ?

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

Javix

unread,
Feb 11, 2013, 10:25:01 AM2/11/13
to rubyonra...@googlegroups.com
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

Jordon Bedwell

unread,
Feb 11, 2013, 10:25:05 AM2/11/13
to rubyonra...@googlegroups.com
On Mon, Feb 11, 2013 at 9:20 AM, Jordon Bedwell <envy...@gmail.com> wrote:
>> 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 ?
>
> date_array.chunk { |v| v.month }.map { |v| v.last }

You can also use group_by to turn it into a hash with the month as the key.
Reply all
Reply to author
Forward
0 new messages