From: James Cunningham Date: 2006-11-27T09:05:07+09:00 Subject: Re: ruby and list comprehension On 2006-11-26 19:01:53 -0500, James Cunningham said: > On 2006-11-26 17:52:37 -0500, dblack@wobblini.net said: > >> Hi -- >> >> On Mon, 27 Nov 2006, James Cunningham wrote: >> >>> On 2006-11-25 18:47:26 -0500, Brad Tilley said: >>> >>>> In Python, I can do this to arrays: >>>> >>>> added = [x for x in new_data if x not in old_data] >>>> removed = [x for x in old_data if x not in new_data] >>>> same = [x for x in new_data if x in old_data] >>>> >>>> I believe this is known as list comprehension in Python. How is this done in >>>> Ruby? >>>> >>>> Thanks, >>>> Brad >>> >>> I found this while web searching for the same thing recently; I can't >>> recall where I found it. It's a cute little hack. >>> >>> class Array >>> def comprehend >>> return self unless block_given? >>> result = [] >>> self.each { |i| result.push yield(i) } >>> result.compact >>> end >>> end >>> >>> Then: >>> >>> added = new_data.comprehend { |x| x if not old_data.include? x } >>> removed = old_data.comprehend { |x| x if not new_data.include? x } >>> same = new_data.comprehend { |x| x if old_data.include? x } >> >> I'm not getting how that's better than: >> >> added = new_data.select {|x| not old_data.include?(x) } >> >> (or the reject equivalent) and so on. >> >> >> David > > > I should have clarified. In your example there's no difference, but the > above gives a general replacement for list comprehensions. > > irb(main):018:0> (1..25).to_a.comprehend { |x| x**2 if not x % 2 == 0 } > => [1, 9, 25, 49, 81, 121, 169, 225, 289, 361, 441, 529, 625] > > Best, > James Er, "your" meaning "Brad Tilley's". Best, James