Ruby,Socket实例在类外定义,无法在类中使用

时间:2014-05-04 15:20:20

标签: ruby class sockets

我对红宝石很新,我刚开始昨天。我正在尝试连接到irc服务器,加入频道,打印消息,退出,然后关闭套接字。

require 'socket'

# server information
$host = 'irc.m8chat.net'
$port = 6667
$nick = "m8bot"
$channel = "##bottesting"

s = TCPSocket.open($host, $port)

class Irc
   def init
      s.write("NICK #{$nick}")
      s.write("USER #{$nick} 0 * :#{$nick}")
   end

   def quit(msg = $nick)
      s.write("QUIT :#{msg}")
   end

   def join(chan = $channel)
      s.write("JOIN #{chan}")
   end

   def send_msg(msg)
      s.write("SAY #{$channel} :#{msg}")
   end

   def cmd(cmd)
      s.write(cmd)
   end
end

irc = Irc.new

irc.join
irc.send_msg("Hello world")
irc.quit

s.close

这里的问题是s不能在类Irc中使用。我试图在每次出现s之前追加$,虽然我没有得到任何回报,但也没有发生任何事情。我觉得我在这里错过了一些非常简单的东西。

我喜欢一些反馈,谢谢。

1 个答案:

答案 0 :(得分:1)

s是一个局部变量,除非你传入它,否则你将无法在你的类中使用它。所有的$变量都是全局的,如果可以,你应该避免使用全局变量。我无法告诉你为什么$a没有效果,但建议您阅读something about dependency injectionthe Ruby variable scope

我不知道你是否出于教育原因这样做,但is help cinch {{3}},即使您不想使用任何这些库,您仍然可以了解如何他们工作。