Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我需要一个类来调用一个类,该类将它作为一个属性包含在许多场景中——这应该如何实现?_Ruby_Delegates_Structure - Fatal编程技术网

Ruby 我需要一个类来调用一个类,该类将它作为一个属性包含在许多场景中——这应该如何实现?

Ruby 我需要一个类来调用一个类,该类将它作为一个属性包含在许多场景中——这应该如何实现?,ruby,delegates,structure,Ruby,Delegates,Structure,我是Ruby的新手,来自Objective-C和Swift 我遇到了一个问题,其中一个对象包含另一个对象作为属性。第二个对象有一个beginStream函数,通过该函数,它从服务器流式传输数据,当它获得新数据时,它就会产生,因此第一个对象可以响应。看起来是这样的: class StreamManager def initialize @streams = Array.new end def setup_user_stream(user_id)

我是Ruby的新手,来自Objective-C和Swift

我遇到了一个问题,其中一个对象包含另一个对象作为属性。第二个对象有一个
beginStream
函数,通过该函数,它从服务器流式传输数据,当它获得新数据时,它就会产生,因此第一个对象可以响应。看起来是这样的:

class StreamManager
    def initialize
        @streams = Array.new
    end

    def setup_user_stream(user_id)
        stream = Stream.new(user_id)
        @streams << stream

        stream.begin_stream do |message|
            puts "A message was received: #{message}"
        end
    end
end

class Stream
    def initialize(user_id)
        @user_id = user_id
    end

    def begin_stream
        Thread.new do
            # Begins stream
            @client = Stream::Client.new(user_id)

            @client.on_error do
                # need to let StreamManager know about this
            end

            @client.on_message do |message|
                yield message if block_given?
            end
        end
    end
end
类流管理器
def初始化
@streams=Array.new
结束
def设置用户流(用户id)
stream=stream.new(用户id)

@streams父级
StreamManager
可以将自身作为变量传递给子级
Stream

def initialize(stream_manager, user_id)
    @stream_manager = stream_manager
    @user_id = user_id
end
以及在设置\用户\流中初始化它:

stream = Stream.new(self, user_id)
如果您想要更详细的代码,可以使用命名关键字:

def initialize(:stream_manager, :user_id)
然后:


父级
StreamManager
可以将自身作为变量传递给子级
Stream

def initialize(stream_manager, user_id)
    @stream_manager = stream_manager
    @user_id = user_id
end
以及在设置\用户\流中初始化它:

stream = Stream.new(self, user_id)
如果您想要更详细的代码,可以使用命名关键字:

def initialize(:stream_manager, :user_id)
然后:


这里有几种不同的方法:

1) 您仍然可以使用在Cocoa中使用的委托模式。唯一的区别是你没有一个正式的协议/接口。流将采用委托/回调处理程序对象,该对象是实现某些方法的任何对象。通过在调用这些方法之前检查对象对它们的响应,可以使这些方法成为可选的。您的StreamManager可以实现此接口,并将其自身作为依赖项传递给流

2) 您可以在流类上定义错误和消息的回调,而不是将单个块传递给begin\u Stream方法

3) 保留现有API,而不是生成消息,将消息或错误封装在结果对象中并生成该结果。我想这可能是我的首选


很抱歉没有代码示例,但我正在我的iPhone上写这篇文章

这里有几种不同的方法:

1) 您仍然可以使用在Cocoa中使用的委托模式。唯一的区别是你没有一个正式的协议/接口。流将采用委托/回调处理程序对象,该对象是实现某些方法的任何对象。通过在调用这些方法之前检查对象对它们的响应,可以使这些方法成为可选的。您的StreamManager可以实现此接口,并将其自身作为依赖项传递给流

2) 您可以在流类上定义错误和消息的回调,而不是将单个块传递给begin\u Stream方法

3) 保留现有API,而不是生成消息,将消息或错误封装在结果对象中并生成该结果。我想这可能是我的首选


很抱歉没有代码示例,但我正在我的iPhone上写这篇文章

几个问题。。。这难道不会使流管理器成为流的强持有属性吗?有没有一种方法可以让流管理器不一定是StreamManager类,而只是一个符合协议的类?这样合适吗?或者这仍然不是真正的Ruby吗?当然,您可以为管理器编写一个包装器类并引用它。我不会用“它是不是ruby的东西”来考虑它,因为它实际上取决于你在设计模式方面坚持什么样的标准。如果管理器类是抽象的,并且您想要编写一些特定于用例的代码,那么无论如何这很好,制作一个包装器。但在一般意义上,如果存储对单独类实例的引用,我看不出妖怪在哪里。。。这难道不会使流管理器成为流的强持有属性吗?有没有一种方法可以让流管理器不一定是StreamManager类,而只是一个符合协议的类?这样合适吗?或者这仍然不是真正的Ruby吗?当然,您可以为管理器编写一个包装器类并引用它。我不会用“它是不是ruby的东西”来考虑它,因为它实际上取决于你在设计模式方面坚持什么样的标准。如果管理器类是抽象的,并且您想要编写一些特定于用例的代码,那么无论如何这很好,制作一个包装器。但在一般意义上,如果存储对单独类实例的引用,我看不出妖怪在哪里。