Class method access instance variable?

Hi, I'm just learning ruby and I'm working on a server connection. I
have the following code:

class IRCBot

   ....

   def connect
      puts "Connecting to #{@server}..."
      @conn = TCPSocket.new( @server, @port )
      handle_server_registration
   end
end

I have another class that needs to perform a '@conn.send("asdf",0)'.
Can anyone help me figure out how I can have this external class access
the @conn instance variable?

Thanks!

upenox

···

--
Posted via http://www.ruby-forum.com/.

Don't access the @conn instance variable directly.

Use an attr_accessor in the class IRCBot and the just ask for the
@irc_bot_instance.conn

HTH
Daniel

···

On 8/23/07, Finn Koch <splitform@gmail.com> wrote:

Hi, I'm just learning ruby and I'm working on a server connection. I
have the following code:

class IRCBot

   ....

   def connect
      puts "Connecting to #{@server}..."
      @conn = TCPSocket.new( @server, @port )
      handle_server_registration
   end
end

I have another class that needs to perform a '@conn.send("asdf",0)'.
Can anyone help me figure out how I can have this external class access
the @conn instance variable?

Thanks!

upenox
--

Hi --

Hi, I'm just learning ruby and I'm working on a server connection. I
have the following code:

class IRCBot

  ....

  def connect
     puts "Connecting to #{@server}..."
     @conn = TCPSocket.new( @server, @port )
     handle_server_registration
  end
end

I have another class that needs to perform a '@conn.send("asdf",0)'.
Can anyone help me figure out how I can have this external class access
the @conn instance variable?

It can't, at least not directly. However, Ruby provides a very easy
way to wrap instance variables in accessor (get/set) methods. In your
case, it would be something like this:

   class IRCBot
     attr_reader :conn # "getter" (reader) method wrapped around @conn

     def connect
       puts ...
       # etc.
     end
   end

Now you can do:

   class OtherClass
     def whatever
       bot = IRCBot.new
       bot.conn... # you now have access to bot's conn attribute
     end
   end

Another way to put this is: Ruby objects can have attributes, which
are readable and/or writeable. From the outside, these are just
methods. From the inside (the class where they're defined), they are
implemented (unless you write a fancier custom version) as wrapper
methods around instance variables.

David

···

On Thu, 23 Aug 2007, Finn Koch wrote:

--
* Books:
   RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242\)
   RUBY FOR RAILS (http://www.manning.com/black\)
* Ruby/Rails training
     & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

Daniel ----- wrote:

      puts "Connecting to #{@server}..."
Thanks!

upenox
--

Don't access the @conn instance variable directly.

Use an attr_accessor in the class IRCBot and the just ask for the
@irc_bot_instance.conn

HTH
Daniel

Thanks for the response :slight_smile:

I have tried this, with no luck. I have an external file that creates
the new instance of IRCBot:

mybot = IRCBot.new

I tried referring to it as 'mybot.conn.send("asdf", 0)', but that didn't
work.

Here is the external file that gets loaded:

class IRCCallback
        def self.check_next( input )
                mybot.conn.send("PRIVMSG matt-mb :hey-o", 0)
                puts "irc callback working"
        end

end

So I guess to sum up, I have mybot.rb which contains the "mybot =
IRCBot.new", the IRCBot.rb which contains the method in my original
post, and I have the IRCCallback.rb which gets loaded prior to calling
the function which in turns calls the method in IRCBot.rb.

Thanks again! :slight_smile:

···

On 8/23/07, Finn Koch <splitform@gmail.com> wrote:

--
Posted via http://www.ruby-forum.com/\.

Can you http://pastie.caboo.se/ your relevant code. In it's entirety. I
can't see where in IRCCallback mybot is defined etc.

It would sure help to see these.

Thanx
Daniel

···

On 8/23/07, Finn Koch <splitform@gmail.com> wrote:

Daniel ----- wrote:
> On 8/23/07, Finn Koch <splitform@gmail.com> wrote:
>> puts "Connecting to #{@server}..."
>> Thanks!
>>
>> upenox
>> --
>
>
> Don't access the @conn instance variable directly.
>
> Use an attr_accessor in the class IRCBot and the just ask for the
> @irc_bot_instance.conn
>
> HTH
> Daniel

Thanks for the response :slight_smile:

I have tried this, with no luck. I have an external file that creates
the new instance of IRCBot:

mybot = IRCBot.new

I tried referring to it as 'mybot.conn.send("asdf", 0)', but that didn't
work.

Here is the external file that gets loaded:

class IRCCallback
        def self.check_next( input )
                mybot.conn.send("PRIVMSG matt-mb :hey-o", 0)
                puts "irc callback working"
        end

end

So I guess to sum up, I have mybot.rb which contains the "mybot =
IRCBot.new", the IRCBot.rb which contains the method in my original
post, and I have the IRCCallback.rb which gets loaded prior to calling
the function which in turns calls the method in IRCBot.rb.

Thanks again! :slight_smile:
--
Posted via http://www.ruby-forum.com/\.

* Finn Koch <splitform@gmail.com> (04:38) schrieb:

I have tried this, with no luck. I have an external file that creates
the new instance of IRCBot:

Stop thinking of files, Ruby is about objects, it doesn't in which files
statements are, as long as they are processed.

mybot = IRCBot.new

mybot is a local variable now.

I tried referring to it as 'mybot.conn.send("asdf", 0)', but that didn't
work.

What do you mean, what happended? Does IRCBot have an conn method? What
happens if you use mybot.conn? [1]

class IRCCallback
        def self.check_next( input )
                mybot.conn.send("PRIVMSG matt-mb :hey-o", 0)
                puts "irc callback working"
        end

end

There is no local variable mybot here. Call it $mybot if you want
global variables, but you really shouldn't want that.

Try:

class IRCCallback
  attr_accessor :bot

  def self.check_next( input )
     @bot.conn.send("PRIVMSG matt-mb :hey-o", 0)
     puts "irc callback working"
  end
end

IRCCallback.bot = IRCBot.new

mfg, simon .... l

[1] Why the hell did BasicSocket redefine Object#send?

Daniel ----- wrote:

···

On 8/23/07, Finn Koch <splitform@gmail.com> wrote:

> Don't access the @conn instance variable directly.
the new instance of IRCBot:
        def self.check_next( input )

Thanks again! :slight_smile:
--
Posted via http://www.ruby-forum.com/\.

Can you http://pastie.caboo.se/ your relevant code. In it's entirety.
I
can't see where in IRCCallback mybot is defined etc.

It would sure help to see these.

Thanx
Daniel

http://pastie.caboo.se/90341

--
Posted via http://www.ruby-forum.com/\.

Hi --

Daniel ----- wrote:

Don't access the @conn instance variable directly.

the new instance of IRCBot:
        def self.check_next( input )

Thanks again! :slight_smile:
--
Posted via http://www.ruby-forum.com/\.

Can you http://pastie.caboo.se/ your relevant code. In it's entirety.
I
can't see where in IRCCallback mybot is defined etc.

It would sure help to see these.

Thanx
Daniel

http://pastie.caboo.se/90341

In this:

class IRCCallback
   def self.check_next( input )
     ro.conn.send("PRIVMSG testuser :hey", 0)
     puts "irc callback working"
   end
end

I don't see where ro is being defined.

David

···

On Thu, 23 Aug 2007, Finn Koch wrote:

On 8/23/07, Finn Koch <splitform@gmail.com> wrote:

--
* Books:
   RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242\)
   RUBY FOR RAILS (http://www.manning.com/black\)
* Ruby/Rails training
     & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

David A. Black wrote:

Hi --

http://pastie.caboo.se/90341

In this:

class IRCCallback
   def self.check_next( input )
     ro.conn.send("PRIVMSG testuser :hey", 0)
     puts "irc callback working"
   end
end

I don't see where ro is being defined.

David

Oh, sorry, that should read 'mybot.conn.send("PRIVMSG testuser :hey",
0)'

That's what I was trying last night.

···

On Thu, 23 Aug 2007, Finn Koch wrote:

--
Posted via http://www.ruby-forum.com/\.

Hi --

David A. Black wrote:

Hi --

http://pastie.caboo.se/90341

In this:

class IRCCallback
   def self.check_next( input )
     ro.conn.send("PRIVMSG testuser :hey", 0)
     puts "irc callback working"
   end
end

I don't see where ro is being defined.

David

Oh, sorry, that should read 'mybot.conn.send("PRIVMSG testuser :hey",
0)'

OK... (well, not OK :slight_smile: but I now know what you meant) but I'm now not
seeing what purpose the variable 'input' is serving.

That's what I was trying last night.

mybot is a local variable defined in a completely different scope,
different both because method definitions have their own local scope,
and because it's in a different file, either of which would mean it
was out of scope in your method definition.

You need to pass objects around, and make requests of those objects
(i.e., send them messages). Local variables are really just scratchpad
variables for a limited scope.

David

···

On Thu, 23 Aug 2007, Finn Koch wrote:

On Thu, 23 Aug 2007, Finn Koch wrote:

--
* Books:
   RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242\)
   RUBY FOR RAILS (http://www.manning.com/black\)
* Ruby/Rails training
     & consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

David A. Black wrote:

Hi --

   def self.check_next( input )

Oh, sorry, that should read 'mybot.conn.send("PRIVMSG testuser :hey",
0)'

OK... (well, not OK :slight_smile: but I now know what you meant) but I'm now not
seeing what purpose the variable 'input' is serving.

That's what I was trying last night.

mybot is a local variable defined in a completely different scope,
different both because method definitions have their own local scope,
and because it's in a different file, either of which would mean it
was out of scope in your method definition.

You need to pass objects around, and make requests of those objects
(i.e., send them messages). Local variables are really just scratchpad
variables for a limited scope.

David

Well the 'input' var isn't serving a purpose now. I'm just trying to
get the callbacks and everything working and will be using input at a
later time.

So I could pass @conn to the check_next like so?

IRCCallback.check_next(@conn, @username)

And then have:

class IRCCallback
   def check_next(server_connection, username)
     do stuff
   end
end

Does that look correct?

···

On Thu, 23 Aug 2007, Finn Koch wrote:

--
Posted via http://www.ruby-forum.com/\.