Forum: Ruby What does this warning actually mean?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Michael T. Richter (Guest)
on 2007-08-02 16:48
(Received via mailing list)
So, I'm trying my hand at metaprogramming and am finding this the result
of executing my code with -w enabled:

warning: class variable access from toplevel singleton method

(This is spammed ad infinitum anywhere I use the overridden gets, but
it's always the same message and always the same cause: gets.)

The code it's pointing to looks like this:

def override_methods(io_in)
        puts io_in
        class << io_in
                alias :old_gets :gets
                @@override_buffer=[]
                def gets separator = $/
                        raise ArgumentError, "cannot use non-standard
separator" unless separator == $/

                        unless line = @@override_buffer.shift
                                return old_gets
                        else
                                return line
                        end
                end
                def find_end
                        for a in 1..20
                                line = self.old_gets
                                if line == "__END__\n"
                                        @@override_buffer = []
                                        break
                                else
                                        @@override_buffer << line
                                end
                        end
                        self
                end
        end
        io_in
end

def find_block_begin io_in
        io_in = override_methods(io_in)
        io_in.find_end
end

To me the culprit is likely that @@override_buffer thing, but I can't
for the life of me figure out how to get around it.  My modified gets
needs access to that (shared) buffer that the added find_end method
generates while peeking ahead.  @override_buffer and override_buffer
don't work (the latter for reasons obvious to me, the former ... not so
obvious).

Now, the output of the code is exactly what I expect it to be, so this
isn't a show-stopper.  I am, however, in the habit of making my code -w
clean if it's at all possible.  How would I do it with that snippet?
Robert D. (Guest)
on 2007-08-02 17:06
(Received via mailing list)
On 8/2/07, Michael T. Richter <removed_email_address@domain.invalid> wrote:

Michael I got no clue what you are trying to do here, but maybe the
following is hint enouh, BTW, just do not use class variables ;).
522/23 > cat test1.rb && ruby test1.rb

  class << self
    @@a=42
    def a
      @@a +=1
    end
  end
  puts a
test1.rb:3: warning: class variable access from toplevel singleton
method
test1.rb:5: warning: class variable access from toplevel singleton
method
test1.rb:5: warning: class variable access from toplevel singleton
method
43

---------------------------------------------

523/24 > cat test2.rb && ruby test2.rb

  class << self
    def a
      @a||=42
      @a+=1
    end
  end
  puts a


43

HTH
Robert
Robert D. (Guest)
on 2007-09-26 01:11
(Received via mailing list)
Attachment: smiley-4.png (0 Bytes)
On 8/2/07, Michael T. Richter <removed_email_address@domain.invalid> wrote:
>
>
Michael please post in raw text format, this reads terribly and can
probably
not go to the newsgroup.

This much I figured out for myself, Robert.  [image: ;)]
>
>
If you did you should know exactly how to solve the problem, use class
instance variables instead of class variables. A sound advice in all
cases
:)

The problem is that I need to share a variable across *two* functions --
a
> buffer, to be precise.  One function fills the buffer while the other
> consumes from it.  The functions are to be singleton methods on an
> instantiated IO object.  I can't see how to make them share an instance
> variable without doing funky things like calling instance_variable_set on
> the object to provide it with said instance variable before adding the
> singletons.  Using a class variable was a desperate test after running
> headlong into a brick wall trying to share them.
>

You see we are not talking instance variables here, actually we are, the
important thing is instance variable of what, of the class object, or in
your case singleton class object, that will perfectly do the trick.

As it is now, I've got it working with an additional call to
> instance_variable_set before defining the singletons, but it looks kind of
> clunky and I was hoping there was a more elegant approach available.
>

sure does, sure is.

Robert

--
This topic is locked and can not be replied to.