On Wed, Nov 26, 2008 at 8:46 PM, Ben Mabey <[EMAIL PROTECTED]> wrote:
> Avdi Grimm wrote:
>>
>> On Wed, Nov 26, 2008 at 12:17 PM, Matt Wynne <[EMAIL PROTECTED]> wrote:
>>
>>>>
>>>> And class variables are problematic in Rails in development mode because
>>>> of class reloading.
>>>>
>>>
>>> And more generally dangerous for threading reasons, right?
>>>
>>
>>
>> All of the above. My rule of thumb is: don't use them unless I have a
>> very, very good reason. I can't think of the last time I had that
>> good a reason.
>>
>>
>
> So.. you are saying that this is preferred:
>
> class State < AR:Base
>
> def self.names
> @names ||= State.all.map{|s| s.name}
> end
>
> end
>
> to this:
>
> class State < AR:Base
>
> def self.names
> @@names ||= State.all.map{|s| s.name}
> end
>
> end
>
> Is that correct?
>
> How is using a class instance variable safer from a threading point of view?
> Do threads not share class instance variables the same way class variables
> would be shared?
>
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
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users