From: Rick DeNatale Date: 2006-10-26T08:32:08+09:00 Subject: Re: Functional Equivalency On 10/25/06, Justin Collins wrote: > 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')} ]) Darn, I KNEW it was time to get these glasses checked! -- Rick