From: Justin Collins Date: 2006-10-26T02:50:38+09:00 Subject: Re: Functional Equivalency Rick DeNatale wrote: > On 10/25/06, dblack@wobblini.net wrote: > >> Hi -- >> >> On Wed, 25 Oct 2006, tom.mancino wrote: >> >> > This works for multiple keywords: >> > >> > res = adwords.estimateKeywordList([AdWords::KeywordRequest.new(nil, >> > 1000000, false, 'test', 'Broad'), AdWords::KeywordRequest.new(nil, >> > 1000000, false, 'student', 'Broad')]) >> > >> > This doesn't: >> > >> > keywords = ['test','student'] >> > res = adwords.estimateKeywordList([keywords.map! {|x| >> > AdWords::KeywordRequest.new(nil, 1000000, false, x, 'Broad')} ]) >> > >> > Aren't these statements functionaly equivilant, or have I missed >> > something (probably!).....this may be an api problem as well. >> >> map! returns an array -- so in the second example, you've got an array >> inside an array. > > > I don't think so. They should be equivalent. Here's a simplification > of the OPs use case, with a dummy KeywordRequest class and JUST the > expression for the argument: > > rick@frodo:/public/rubyscripts$ cat kwl.rb > class KeywordRequest > def initialize(kwd) > @kwd = kwd > end > > def inspect > "KWR(#{@kwd})" > end > > end > > puts "With array literal" > p [KeywordRequest.new('test'), KeywordRequest.new('student')] > > keywords = ['test', 'student'] > puts "With map" > puts "result=#{keywords.map {|x| KeywordRequest.new(x)}.inspect}" > puts "keywords=#{keywords.inspect}" > puts "with map!" > puts "result=#{keywords.map! {|x| KeywordRequest.new(x)}.inspect}" > puts "keywords=#{keywords.inspect}" > > > rick@frodo:/public/rubyscripts$ ruby kwl.rb > With array literal > [KWR(test), KWR(student)] > With map > result=[KWR(test), KWR(student)] > keywords=["test", "student"] > with map! > result=[KWR(test), KWR(student)] > keywords=[KWR(test), KWR(student)] > > Both forms return a single level array of KeywordRequests. > > It is probably better to use :map instead of :map! unless he WANTS to > clobber the array of keywords. > > The point wasn't that map and map! are different - it's that the OP takes the result from map! and puts it inside an array (note the square brackets): res = adwords.estimateKeywordList([keywords.map! {|x| AdWords::KeywordRequest.new(nil, 1000000, false, x, 'Broad')} ]) Which makes it an array within an array. With the first form, it's a flat array: res = adwords.estimateKeywordList([AdWords::KeywordRequest.new(nil, 1000000, false, 'test', 'Broad'), AdWords::KeywordRequest.new(nil, 1000000, false, 'student', 'Broad')]) The difference is probably why the second form is failing. -Justin