The freeze method makes an mutable object immutable, which may help
you in this case.  I don't think there is a way to pass objects by
value, which you wouldn't want anyways, as it would pollute the stack.

str.freeze
str << "append" #throws an exception

--Dan

On Jul 26, 3:39 pm, Glenn Little <[email protected]> wrote:
> Just curious, is there a ruby best practice for effectively passing
> parameters by value to protect them from side effects?
>
> I've got a recursive function that modifies a passed in value then
> passes that variable to a series of sibling children in turn (where
> obviously, it gets further mutated in each).  I don't want the changes
> to propagate across to the siblings though.  Roughly (ignoring return
> values and base-case conditions):
>
> def recurse(x = nil)
>   x = <some processing to reflect current node>
>   self.children.each do |c|
>     c.recurse(x)   # x will change with each iteration, but don't want that
>   end
> end
>
> I've found that using Object#dup in the method call does work:
>
>     c.recurse(x.dup)
>
> But it feels maybe a little hacky.  Is there a more accepted form?  I
> could put the dup into the method definition instead:
>
> def recurse(x = nil)
>   y = x.dup
>   y = <some processing to reflect current node>
>   self.children.each do |c|
>     c.recurse(y)
>   end
> end
>
> But not sure if that's better or worse or if it even matters.  Any thoughts?
>
> Thanks...
>
> -glenn

-- 
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby

Reply via email to