David Vallner
2/12/2006 9:49:00 PM
Dna Nedela 12 Február 2006 22:18 eastcoastcoder@gmail.com napísal:
> Very often, I'd like to ensure (and document) that a method will not
> change any of its parameters:
The most Ruby way would be plain not changing the parameters - you're
perfectly sure the method doesn't do that when it doesn't do that. Quoting
James Britt from a recent post: "Ruby assumes the developer is a grown-up."
Also, I believe the convention would be that a method doesn't clobber its
parameters unless -that- is explicitly documented, so I wouldn't go out of my
way to document that a method does -not- change its parameters.
>
> # This looks at, but doesn't modify, a and b
> def mymethod(a, b)
> end
>
> In C++ I can do this with the const modifier.
Well, with the risk of stating the obvious, Ruby isn't C++. Some things are
plain done differently. Or not at all.
>
> Is there anyway to do this in Ruby?
>
> I'd call freeze, except that would freeze the original a as well.
> I'd call dup/clone and then freeze, but those aren't deep copies, from
> what I understand.
>
> So, I guess my question boils down to:
> Is there a way to make a frozen, full (ie deep) copy of an object?
Implement #initialize_copy for deep-copy semantics, override #freeze to freeze
instance attributes of the object before.
I wouldn't bother though, as far as I know, freezing objects is only used when
debugging, e.g. when you suspect a bug is due to an object being changed
someplace you don't expect it. It's not encouraged for use in common code
unless necessary.
David Vallner