我正在写一个扩展TCPSocket的Ruby类。 假设它看起来像这样:

class FooSocket < TCPSocket
    def hello
        puts 'hello'
    end
end

我有一个TCPServer监听传入的连接

server = TCPServer.new 1234
socket = server.accept

当我的服务器最终接受连接时,它将返回TCPSocket 但是,我想要一个FooSocket以便可以调用socket.hello

如何将TCPSocket更改为FooSocket

我可以直接将想要的方法和属性直接插入TCPSocket类,但是我在其他地方使用了它,所以我不想这样做。

可能最简单的解决方案是编写一个封装TCPSocket的类,然后将accept返回的套接字作为参数传递。 但是,我很想知道如何通过继承来实现它-我一直在试图绕开它,但无法弄清楚。

提前致谢。

#1楼 票数:1 已采纳

我认为最简单的方法是将FooSocket一个模块,然后extendextend到需要特殊方法的TCPSocket 以下是一些如何使用它的示例:

module FooSocket
  def hello
    self.puts 'hello' # could also be written without the 'self',
  end                 # but it is clearer this way because it may
end                   # be mistaken for the Kernel method.

server = TCPServer.new 1234
socket = server.accept.extend FooSocket

您还可以轻松地重写TCPServer以返回以下其中一项:

class TCPServer
  alias old_accept accept
  def accept
    old_accept.extend FooSocket
  end
end

如果您不想覆盖标准类,则可以在服务器上定义一个单例类(这是我要做的),因为您很可能只有一台服务器。 为此,将上面示例中的行class TCPServer替换为class << server

#2楼 票数:0

您需要在TCPServer类中重写accept ,以通过重新打开类或子类并使用它来返回FooSocket而不是TCPSocket 我认为,在accept返回的TCPSocket实例后,对它进行装扮的想法比较干净。

  ask by Jarsen translate from so

未解决问题?本站智能推荐:

1回复

cpp套接字,继承错误

我创建了一个具有静态成员的套接字类,该成员用于创建不同类型的套接字(客户端和服务器)。 这是界面: 孩子们是: ->服务器: ->客户: 但是在实现initializeSocket和其他成员时,出现错误“不允许使用继承的成员。就我而言,继承的类可以访问
1回复

Ruby套接字性能特征

我正在Ruby中对TCP套接字执行重复的send / recv调用,并且发现两个套接字使用之间存在显着的速度差异 - 简单地说,重新使用套接字比连续关闭和重新打开套接字要慢 。 因此服务器是: 它只是将请求回传给客户端。 客户端1每次重新连接: 客户端2保持其套接字打
2回复

Ruby的select为什么不返回套接字?

我正在尝试在STDIN和Ruby中的TCP套接字上使用select,但是由于某些原因,从select返回的值似乎从未与选择之一匹配; 它看起来像是要返回的套接字,但是使用==(或等于?)不匹配。 谁能告诉我为什么select所返回的结果与我传入的对象不匹配,以及在这里我应该做些什么?
3回复

我可以通过Ruby套接字发送字节吗?

通常,我们可以在C或C ++套接字程序中发送字节,所以我想知道我可以在Ruby中执行此操作吗?
1回复

Ruby中的套接字超时[关闭]

关闭。 此问题不可重现或由拼写错误引起。 它目前不接受答案。
1回复

Ruby套接字保持等待响应

我是Ruby编程的新手,我试图构建一个简单的回显服务器,但是在client.gets它冻结了。 我是套接字编程的新手。 server.rb require "socket" require "tty/prompt" socket = TCPServer.open("0.0.0.0",
1回复

Ruby在recv时检测套接字关闭

我有一个连接服务器的红宝石套接字客户端,该服务器将随时关闭连接。 这是我的代码: 我如何在这里检测插座关闭?
2回复

Ruby:如何检测套接字的一侧何时关闭

如何检测套接字是半开的? 我正在处理的情况是套接字的另一端发送了一个 FIN,而 Ruby 应用程序已经确认了该 FIN。 有没有办法告诉我插座处于这种状态? 举个例子: 在这种情况下,当我 telnet 到端口 5010 时,我会看到所有输入,直到我关闭 telnet 会话。 那时,它会尽可