syntax error warning: useless use of a variable in void context

T

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.

Help!
Thanks
 
L

Leslie Viljoen

Tom said:
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

--------------------------
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


Considering I've been using Ruby for a couple of years, I've been
totally frustrated
making this bit of code work.

Help!
Thanks

You seem to be having difficulty accessing the variables in the tla object.
This seems to work:

#!/usr/bin/env ruby

class Tl
attr_reader :a, :b

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
 
C

Christophe Grandsire

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

--------------------------
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


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.
 
A

Ara.T.Howard

class Tl
def initialize(a,b)
@a = a
@b = b
end
def to_s
"#{@a} #{@b}"
end
def <=>(tlr)
if @a > tlr.@a
^
^
^

you can't do this.

probably you want

attr "a"
...

tlr.a

hth.

-a
--
===============================================================================
| ara [dot] t [dot] howard [at] noaa [dot] gov
| all happiness comes from the desire for others to be happy. all misery
| comes from the desire for oneself to be happy.
| -- bodhicaryavatara
===============================================================================
 
T

Tom Reilly

Thanks everybody.
I had thought that an @_whatever could be seen anywhere the class was used.
TR
 
G

Gavin Kistner

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)".

To be pedantic:
a) attr_reader doesn't make an instance variable readable, it's a
convenient way to add a method that returns the value of the instance
variable.

b) There are other ways (variations on your latter) such as
tlr.instance_eval{ @a }
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,190
Latest member
ClayE7480

Latest Threads

Top