A, b = Array.new(2).map!{|x| data.dup}

I think I can replace this code

@scr = @output.dup
@png = @output.dup
@pdf = @output.dup
@svg = @output.dup
@ps = @output.dup

with this equivalent:

@scr, @png, @pdf, @svg, @ps = Array.new(5).map!{|x| @output.dup}

Is there a nicer variant available?

(Of course @scr, @png, @pdf, @svg, @ps = @output.dup will not work, I
need 5 independent instances.)

Thanks,

Stefan Salewski

Stefan Salewski wrote in post #983432:

I think I can replace this code

@scr = @output.dup
@png = @output.dup
@pdf = @output.dup
@svg = @output.dup
@ps = @output.dup

with this equivalent:

@scr, @png, @pdf, @svg, @ps = Array.new(5).map!{|x| @output.dup}

Is there a nicer variant available?

# here's one
@scr, @png, @pdf, @svg, @ps = Array.new(5) { @output.dup }

# here's another, not for <=1.8.6
@scr, @png, @pdf, @svg, @ps = 5.times.map { @output.dup }

But I think the original 5 lines is clearer :slight_smile:

···

--
Posted via http://www.ruby-forum.com/.

@scr, @png, @pdf, @svg, @ps = 5.times.collect { @output.dup }

···

On Thu, 24 Feb 2011 06:46:15 +0900 Stefan Salewski <mail@ssalewski.de> wrote:

I think I can replace this code

@scr = @output.dup
@png = @output.dup
@pdf = @output.dup
@svg = @output.dup
@ps = @output.dup

with this equivalent:

@scr, @png, @pdf, @svg, @ps = Array.new(5).map!{|x| @output.dup}

Is there a nicer variant available?

--
  WBR, Peter Zotov

Are you sure you can't rework your code to *not* copy data 5x? I assume
you're doing conversion between formats, so the output will be something
completely else anyway. No need to work in-place then (which I assume is
the reason you're dup-ing).

-- niklas

···

On Thu, 2011-02-24 at 06:46 +0900, Stefan Salewski wrote:

I think I can replace this code

@scr = @output.dup
@png = @output.dup
@pdf = @output.dup
@svg = @output.dup
@ps = @output.dup

with this equivalent:

@scr, @png, @pdf, @svg, @ps = Array.new(5).map!{|x| @output.dup}

Is there a nicer variant available?

(Of course @scr, @png, @pdf, @svg, @ps = @output.dup will not work, I
need 5 independent instances.)

Thanks,

Stefan Salewski

[@scr, @png, @pdf, @svg, @ps].collect!{|x| @output.dup}

···

Date: Thu, 24 Feb 2011 06:46:15 +0900
From: mail@ssalewski.de
Subject: a, b = Array.new(2).map!{|x| data.dup}
To: ruby-talk@ruby-lang.org

I think I can replace this code

@scr = @output.dup
@png = @output.dup
@pdf = @output.dup
@svg = @output.dup
@ps = @output.dup

with this equivalent:

@scr, @png, @pdf, @svg, @ps = Array.new(5).map!{|x| @output.dup}

Is there a nicer variant available?

(Of course @scr, @png, @pdf, @svg, @ps = @output.dup will not work, I
need 5 independent instances.)

Thanks,

Stefan Salewski

www.wholesalesnkey.net
windows 7
office 2007
office 2010
office visio key
windows visio key
windows xp key

···

--
Posted via http://www.ruby-forum.com/.

*ding **ding* *ding* *ding* *ding*

WE HAVE A WINNAR!

···

On Feb 23, 2011, at 14:00 , niklas | brueckenschlaeger wrote:

Are you sure you can't rework your code to *not* copy data 5x? I assume
you're doing conversion between formats, so the output will be something
completely else anyway. No need to work in-place then (which I assume is
the reason you're dup-ing).

Stefan Salewski wrote in post #983432:

> Is there a nicer variant available?

# here's one
@scr, @png, @pdf, @svg, @ps = Array.new(5) { @output.dup }

# here's another, not for <=1.8.6
@scr, @png, @pdf, @svg, @ps = 5.times.map { @output.dup }

But I think the original 5 lines is clearer :slight_smile:

Thanks. I agree, but I am still learning Ruby, so I like to see what is
possible. And I like to save some lines of code. On the other hand,
plain code is easier to understand and can easier converted to other
languages, I know.

···

On Thu, 2011-02-24 at 06:58 +0900, Brian Candler wrote:

The code is related to handling configuration files, I have a basic
configuration set, a hash called @output. And variants for on screen,
pdf, png export. I can avoid duplicates, of course, if I look at the
basic hash and at the special variants each time. But that is a little
bit more complicated and consumes more time, which is not really good.

All that is related to a graphical editor -- I have to clean up the code
a bit, it will become available on my page some time, then we can
discuss improvements. A tiny part related to cairo drawing is already
there:

http://www.ssalewski.de/PetEd-Demo.html.en

···

On Thu, 2011-02-24 at 07:00 +0900, niklas | brueckenschlaeger wrote:

Are you sure you can't rework your code to *not* copy data 5x?

oops, this doesn't work.... sorry

···

Date: Thu, 24 Feb 2011 17:42:11 +0900
From: tdihp@hotmail.com
Subject: Re: a, b = Array.new(2).map!{|x| data.dup}
To: ruby-talk@ruby-lang.org

[@scr, @png, @pdf, @svg, @ps].collect!{|x| @output.dup}

> Date: Thu, 24 Feb 2011 06:46:15 +0900
> From: mail@ssalewski.de
> Subject: a, b = Array.new(2).map!{|x| data.dup}
> To: ruby-talk@ruby-lang.org
>
> I think I can replace this code
>
> @scr = @output.dup
> @png = @output.dup
> @pdf = @output.dup
> @svg = @output.dup
> @ps = @output.dup
>
> with this equivalent:
>
> @scr, @png, @pdf, @svg, @ps = Array.new(5).map!{|x| @output.dup}
>
> Is there a nicer variant available?
>
> (Of course @scr, @png, @pdf, @svg, @ps = @output.dup will not work, I
> need 5 independent instances.)
>
> Thanks,
>
> Stefan Salewski
>
>
>

ok, try also something like,

  a,b,c,d,e =[x.dup]*5

best regards -botp

···

On Thu, Feb 24, 2011 at 6:24 AM, Stefan Salewski <mail@ssalewski.de> wrote:

On Thu, 2011-02-24 at 07:00 +0900, niklas | brueckenschlaeger wrote:

Are you sure you can't rework your code to *not* copy data 5x?

The code is related to handling configuration files, I have a basic

Stefan Salewski wrote in post #983443:

The code is related to handling configuration files, I have a basic
configuration set, a hash called @output. And variants for on screen,
pdf, png export.

In that case, I'd say you'd be better off avoiding all the separate
instance variables for each variant, and make it data-driven. Then you
can interate over the variants, which will naturally avoid the repeated
code.

FORMATS = [:scr, :png, :pdf, :svg, :ps]
...
@configs = {}
FORMATS.each { |k| @configs[k] = @output.dup }

Now you have @configs[:scr], @configs[:png] etc, all pointing to
separate copies of @output. And if you want to add another format in
future, it's a trivial change.

(Aside: please do not post variants of this code using 'inject', because
it's stupid here. You know who you are. Thank you.)

Regards,

Brian.

···

--
Posted via http://www.ruby-forum.com/.

ok, try also something like,

a,b,c,d,e =[x.dup]*5

That will cause a, b, c, d, e to point to the same objects, which
might result in an unexpected side effect.

x = "foo"
a, b, c, d, e = [x.dup] * 5
puts a #=> "foo"
b << " bar"
puts a #=> "foo bar"

···

--
Anurag Priyam
http://about.me/yeban/

Stefan Salewski wrote in post #983443:
> The code is related to handling configuration files, I have a basic
> configuration set, a hash called @output. And variants for on screen,
> pdf, png export.

In that case, I'd say you'd be better off avoiding all the separate
instance variables for each variant, and make it data-driven. Then you
can interate over the variants, which will naturally avoid the repeated
code.

FORMATS = [:scr, :png, :pdf, :svg, :ps]
...
@configs = {}
FORMATS.each { |k| @configs[k] = @output.dup }

This would be the same as:

  @configs = Hash.new {|h,k| h[k] = @output.dup }

after that you can use pretty much any key you want :slight_smile:

-- niklas

···

On Thu, 2011-02-24 at 18:09 +0900, Brian Candler wrote:

Now you have @configs[:scr], @configs[:png] etc, all pointing to
separate copies of @output. And if you want to add another format in
future, it's a trivial change.

(Aside: please do not post variants of this code using 'inject', because
it's stupid here. You know who you are. Thank you.)

Regards,

Brian.

ok, try also something like,

a,b,c,d,e =[x.dup]*5

That will cause a, b, c, d, e to point to the same objects,

indeed. but they will not point to or clobber x

which might result in an unexpected side effect.

indeed. but it may have a good effect too. the user is working on graphics.

let's just see if user has a need for it...

best regards -botp

···

On Thu, Feb 24, 2011 at 1:40 PM, Anurag Priyam <anurag08priyam@gmail.com> wrote:

> ok, try also something like,
>
> a,b,c,d,e =[x.dup]*5

That will cause a, b, c, d, e to point to the same objects, which
might result in an unexpected side effect.

Indeed, that was not what I wanted, I need 5 independent instances!

Brian Candler wrote:

Stefan Salewski wrote in post #983443:

The code is related to handling configuration files, I have a basic
configuration set, a hash called @output. And variants for on screen,
pdf, png export.

In that case, I'd say you'd be better off avoiding all the separate
instance variables for each variant, and make it data-driven. Then you
can interate over the variants, which will naturally avoid the repeated
code.

FORMATS = [:scr, :png, :pdf, :svg, :ps]
...
@configs = {}
FORMATS.each { |k| @configs[k] = @output.dup }

Now you have @configs[:scr], @configs[:png] etc, all pointing to
separate copies of @output. And if you want to add another format in
future, it's a trivial change.

(Aside: please do not post variants of this code using 'inject', because
it's stupid here. You know who you are. Thank you.)

Regards,

Brian.

I see the point, thanks.

Best regards,

Stefan Salewski

···

On Thu, 2011-02-24 at 11:10 +0530, Anurag Priyam wrote:

Well, then you could just do
a = b = c = d = e = x.dup

No need for parallel assignment tricks if you are okay with them pointing to
the same object.

···

On Thu, Feb 24, 2011 at 12:11 AM, botp <botpena@gmail.com> wrote:

On Thu, Feb 24, 2011 at 1:40 PM, Anurag Priyam <anurag08priyam@gmail.com> > wrote:
>> ok, try also something like,
>>
>> a,b,c,d,e =[x.dup]*5
>
> That will cause a, b, c, d, e to point to the same objects,

indeed. but they will not point to or clobber x

my bad. should have read the whole op post... "..@stefan:.. I
need 5 independent instances..."

sorry for the noise.
kind regards -botp

···

On Thu, Feb 24, 2011 at 2:11 PM, botp <botpena@gmail.com> wrote:

let's just see if user has a need for it...

indeed. i was too tight on parallels and arrays and forgetting the
fundamentals =)
thanks and kind regards -botp

···

On Thu, Feb 24, 2011 at 3:44 PM, Josh Cheek <josh.cheek@gmail.com> wrote:

Well, then you could just do
a = b = c = d = e = x.dup