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

On 8/23/07, Finn K. [email protected] 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

Daniel ----- wrote:

On 8/23/07, Finn K. [email protected] 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:

Hi –

On Thu, 23 Aug 2007, Finn K. wrote:

 @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 8/23/07, Finn K. [email protected] 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

Daniel ----- wrote:

On 8/23/07, Finn K. [email protected] 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

David A. Black wrote:

Hi –

On Thu, 23 Aug 2007, Finn K. wrote:

Parked at Loopia
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.

Hi –

On Thu, 23 Aug 2007, Finn K. wrote:

Parked at Loopia
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

Hi –

On Thu, 23 Aug 2007, Finn K. wrote:

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

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?

David A. Black wrote:

Hi –

On Thu, 23 Aug 2007, Finn K. wrote:

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?