On 10/6/2010 2:58 PM, Jeremy Bopp wrote:
> On 10/6/2010 2:01 PM, Paul Roche wrote:
>> Stefano Crocco wrote:
>>> On Wednesday 06 October 2010, Paul Roche wrote:
>>>> |Hi. When I use class variables with operators I get the following error
>>>> |message........
>>>> |
>>>> | undefined method `>' for nil:NilClass
>>>> |
>>>> |
>>>> |here's a piece of code that gives this error.....
>>>> |
>>>> |if @@target1 <  @@target2
>>>> |   @@status = true
>>>
>>> It means that @@target1 is nil. Try
>>>
>>>   p @@target1
>>>
>>> just before the if and see what it shows.
>>>
>>> Stefano
>>
>> The problem is I intialise the attributes first.......
>>
>> def initialize(tar1, tar2)
>> @@target1 = tar1
>> @@target2 = tar2
>> end
>>
>>
>> Then I use this method....
>>
>> def self.on_target?(mltn)
>> mltn.each do |trg|
>> if trg.target1 > trg.target2
>> then p "on target"
>> else
>> off_target
>> end
>> end
>> end
>>
>> and call this method in the method above...
>>
>> def off_target
>> @@target1 = @@target1 - @@target2
>> end
>>
>> So I want to make off_target accessable which is why I use @@
> 
> You don't need @@ in order to make off_target accessible.  That method
> is already accessible from any instance of your class.  What you
> probably mean is that you need @@ to make target1 and target2
> accessible.  However, the @@target1 and @@target2 variables are actually
> class variables shared among all instances of your class, which is
> probably not what you want.
> 
> class MyClass
>   def initialize(value)
>     @@value = value
>   end
> 
>   def get_value
>     @@value
>   end
> end
> 
> my_class1 = MyClass.new(1)
> my_class1.get_value                   # => 1
> 
> my_class2 = MyClass.new("unexpected")
> 
> my_class1.get_value                   # => "unexpected"
> 
> 
> What you want instead are instance variables such as @target1 and
> @target2.  I found these notations a little hard to remember at first,
> but you'll find that defining class variables is pretty rare and that
> you can usually just use @variable. :-)

Hmm.  Looking closer at what you're trying to do, I see that you do need
the class variables in your current implementation.  The problem is that
I can't figure out why you are trying to use a class method (on_target?)
for this rather than an instance method.  It looks like Stefano is also
confused about what you're trying to do here.

Please understand that you are mixing together class and instance
methods.  For now you should probably stick to instance methods since
they are more common:

class MyClass
  def my_instance_method
    ...
  end
end

Rather than...

class MyClass
  def self.my_class_method
    ...
  end
end


Once you have a handle on instance methods, understanding class methods
and how they differ from instance methods will be easier.

-Jeremy