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

Discussion in 'Ruby' started by Tom Reilly, Nov 23, 2005.

  1. Tom Reilly

    Tom Reilly Guest

    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
     
    Tom Reilly, Nov 23, 2005
    #1
    1. Advertising

  2. Tom Reilly wrote:

    > 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


    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
     
    Leslie Viljoen, Nov 23, 2005
    #2
    1. Advertising

  3. 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.
     
    Christophe Grandsire, Nov 23, 2005
    #3
  4. Tom Reilly

    Ara.T.Howard Guest

    On Thu, 24 Nov 2005, Tom Reilly wrote:

    > 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
    ===============================================================================
     
    Ara.T.Howard, Nov 23, 2005
    #4
  5. Tom Reilly

    Tom Reilly Guest

    Thanks everybody.
    I had thought that an @_whatever could be seen anywhere the class was used.
    TR
     
    Tom Reilly, Nov 23, 2005
    #5
  6. On Nov 23, 2005, at 3:57 PM, Christophe Grandsire wrote:
    > 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 }
     
    Gavin Kistner, Nov 24, 2005
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. George R. Gonzalez

    Useless use of private variable in void context ... ?

    George R. Gonzalez, Aug 8, 2003, in forum: Perl Misc
    Replies:
    1
    Views:
    232
    Brian McCauley
    Aug 8, 2003
  2. jon rogers
    Replies:
    3
    Views:
    275
    Eric J. Roode
    Dec 4, 2003
  3. makko
    Replies:
    2
    Views:
    2,483
    makko
    Sep 19, 2005
  4. Marek
    Replies:
    24
    Views:
    771
    Dr.Ruud
    Jun 16, 2007
  5. Replies:
    7
    Views:
    197
    Peter J. Holzer
    Dec 15, 2007
Loading...

Share This Page