class DRb::DRbObject
Object
,封装对远程 drb 对象的引用。
对此对象的方法调用会转发到此对象作为存根的远程对象。
公共类方法
_load(s) 点击以切换源代码
new(obj, uri=nil) 点击以切换源代码
创建一个新的远程对象存根。
obj
是我们想要为其创建存根的(本地)对象。通常,这是 nil
。uri
是此存根将指向的远程对象的 URI。
# File drb-2.2.1/lib/drb/drb.rb, line 1089 def initialize(obj, uri=nil) @uri = nil @ref = nil case obj when Object is_nil = obj.nil? when BasicObject is_nil = false end if is_nil return if uri.nil? @uri, option = DRbProtocol.uri_option(uri, DRb.config) @ref = DRbURIOption.new(option) unless option.nil? else @uri = uri ? uri : (DRb.uri rescue nil) @ref = obj ? DRb.to_id(obj) : nil end end
new_with(uri, ref) 点击以切换源代码
使用远程主机 uri
和对象 ref
的引用信息创建一个 DRb::DRbObject
。
# File drb-2.2.1/lib/drb/drb.rb, line 1065 def self.new_with(uri, ref) it = self.allocate it.instance_variable_set(:@uri, uri) it.instance_variable_set(:@ref, ref) it end
new_with_uri(uri) 点击以切换源代码
仅从 URI 创建一个新的 DRbObject
。
# File drb-2.2.1/lib/drb/drb.rb, line 1073 def self.new_with_uri(uri) self.new(nil, uri) end
公共实例方法
__drbref() 点击以切换源代码
如果对象是本地的,则获取对象的引用。
# File drb-2.2.1/lib/drb/drb.rb, line 1115 def __drbref @ref end
__drburi() 点击以切换源代码
获取远程对象的 URI。
# File drb-2.2.1/lib/drb/drb.rb, line 1110 def __drburi @uri end
_dump(lv) 点击以切换源代码
序列化此对象。
对象的 URI 和 ref 被序列化。
# File drb-2.2.1/lib/drb/drb.rb, line 1080 def _dump(lv) Marshal.dump([@uri, @ref]) end
method_missing(msg_id, *a, &b) 点击以切换源代码
# File drb-2.2.1/lib/drb/drb.rb, line 1135 def method_missing(msg_id, *a, &b) if DRb.here?(@uri) obj = DRb.to_obj(@ref) DRb.current_server.check_insecure_method(obj, msg_id) return obj.__send__(msg_id, *a, &b) end succ, result = self.class.with_friend(@uri) do DRbConn.open(@uri) do |conn| conn.send_message(self, msg_id, a, b) end end if succ return result elsif DRbUnknown === result raise result else bt = self.class.prepare_backtrace(@uri, result) result.set_backtrace(bt + caller) raise result end end
respond_to?(msg_id, priv=false) 点击以切换源代码
将 respond_to? 路由到引用的远程对象。
# File drb-2.2.1/lib/drb/drb.rb, line 1123 def respond_to?(msg_id, priv=false) case msg_id when :_dump true when :marshal_dump false else method_missing(:respond_to?, msg_id, priv) end end