From: Christophe Grandsire Date: 2005-11-24T05:57:40+09:00 Subject: Re: syntax error warning: useless use of a variable in void context Selon Tom Reilly : > class Tl > def initialize(a,b) > @a = a > @b = b > end > def to_s > "#{@a} #{@b}" > end > def <=>(tlr) > if @a > tlr.@a ^^^^^^ > 1 > elsif > @a == tlr.@a ^^^^^^ > 0 > else > -1 > end > end > end > > aa = Tl.new("tom","reilly") > ab = Tl.new("jack","charity") > > r = aa <=> ab > p r > > -------------------------- > >ruby -cw tmp.rb > tmp.rb:12: syntax error > tmp.rb:12: warning: useless use of a variable in void context > tmp.rb:14: syntax error > tmp.rb:15: syntax error > tmp.rb:15: warning: useless use of a variable in void context > tmp.rb:19: warning: else without rescue is useless > tmp.rb:22: syntax error > >Exit code: 1 > > > Considering I've been using Ruby for a couple of years, I've been > totally frustrated > making this bit of code work. > Instance variables are completely private by default in Ruby, and you can only make them accessible by adding accessor methods (what the attr_* methods do for you). You can't access the private instance variable of a different object, even if they have the same class, so your "tlr.@a" simply won't work. The only ways to make this work is: - to make the instance variable @a readable with "attr_reader :a" and replace "tlr.@a" with "tlr.a" - to bypass encapsulation by replacing "tlr.@a" with "tlr.instance_variable_get(:@a)". -- Christophe Grandsire. http://rainbow.conlang.free.fr You need a straight mind to invent a twisted conlang.