From: Rick DeNatale Date: 2006-10-25T23:04:11+09:00 Subject: Re: Functional Equivalency 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. -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/