On Thu, Nov 27, 2008 at 12:52 PM, Nathan Zook <[EMAIL PROTECTED]> wrote:
> That's not a surprise, that's a feature. Know the difference between class
> variables and class instance variables.

Said the preacher to the choir.

But even features can cause surprises. It's a surprise when you're the
consumer of someone else's code. For example, this problem used to
exist in Rails:

   ActionMailer::Base.smtp_settings = { some_config_settings }

Then to give a particular mailer subclass different smtp settings,
this seemed like a logical thing to do:

   class MyMailer  < ActionMailer::Base ; end
   MyMailer.smtp_settings = { my_other_config }

I was a bit surprised when it overrode the smtp settings for every
single mailer, when I expected the change to just go to MyMailer's
smtp_settings. This and many others like it have since been fixed in
Rails, but Rails is not the only code I've seen do this.

Realistically it may take people using class variables incorrectly to
see they really wanted a class instance variable. Hopefully these
discussions help inform people before they have to make that mistake
in code they are writing,

Zach


>
> Zach Dennis wrote:
> ...
>>
>> AFAIK it isn't any safer from a threading point of view.
>>
>> My biggest hate of class variables is that they are shared throughout
>> an entire inheritance hierarchy (and I do not find @@ aesthetically
>> pleasing). Class instance variables are not.
>>
>> class A
>>   def self.foo
>>      @@foo
>>   end
>>
>>   def self.foo=a
>>       @@foo = a
>>   end
>> end
>>
>> class B < A ; end
>> class C < B ; end
>>
>> A.foo = 1
>> A.foo # => 1
>>
>> C.foo # => 1
>> C.foo = 10
>> C.foo # => 10
>> A.foo # => 10 -- surprise!
>>
>> Class instance variables don't have this problem.
>>
>> class A
>>   def self.foo
>>      @foo
>>   end
>>
>>   def self.foo=a
>>       @foo = a
>>   end
>> end
>>
>> class B < A ; end
>> class C < B ; end
>>
>> A.foo = 1
>> A.foo # => 1
>>
>> C.foo # => nil
>> C.foo = 10
>> C.foo # => 10
>> A.foo # => 1
>>
>>
>>
>



-- 
Zach Dennis
http://www.continuousthinking.com
http://www.mutuallyhuman.com
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to