Lyle Johnson wrote:
> Austin Ziegler wrote:
> 
>> On Thu, 14 Nov 2002 05:10:40 +0900, Joel VanderWerf wrote:
>>
>>> Either way, you're breaking encapsulation--by exposing writers, or
>>> by exposing the attrs themselves at the time of construction
>>> (only).
>>
>>
>> You're right, and in some cases, that's OK (see Text::Format for
>> this; I haven't yet modified it to use Lyle's change -- I may not),
>> since all of the methods are exposed anyway.
> 
> 
> The original implementation (introduced in FXRuby 1.0.14) used 
> instance_eval to evaluate the initialization block. I changed it in 
> FXRuby 1.0.15 to instead yield 'self' to the block, primarily because 
> (as Rich Kilmer so eloquently noted "instance_eval() is evil".
> 
> I sort-of agree with Joel's point that either approach breaks 
> encapsulation, assuming that the class' public interface doesn't already 
> provide writers for the attributes of interest. But I think of the two, 
> using instance_eval to explicitly open-up instance variables is 
> definitely more brittle. Remember, an instance method that is a "plain 
> old" attr_writer today could be replaced in the future by a different 
> implementation that does something different (i.e. touches different 
> instance variables or whatever).

I agree completely. There's also the point that using yield rather than 
instance_eval lets you refer to attributes in the static scope:

@last_name = "powers"

me = Person.new {
   @name = 'austin' + @last_name
   @age = 31
}

With instance_eval, you have to pass @last_name into the block using a 
local var.