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?
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
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.
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.
def self.check_next( input )
Oh, sorry, that should read ‘mybot.conn.send(“PRIVMSG testuser :hey”,
0)’
OK… (well, not OK 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.
def self.check_next( input )
Oh, sorry, that should read ‘mybot.conn.send(“PRIVMSG testuser :hey”,
0)’
OK… (well, not OK 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?
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.