DRb::DRbObject
class DRb::DRbObject
Parent:Object
对象包装对远程drb对象的引用。
此对象上的方法调用将被中继到此对象是存根的远程对象。
公共类方法
_load(s) Show source
解组编组的DRbObject。
如果被引用的对象位于本地服务器中,则返回该对象本身。否则,将创建一个新的DRbObject以充当远程引用对象的存根。
# File lib/drb/drb.rb, line 1052
def self._load(s)
uri, ref = Marshal.load(s)
if DRb.here?(uri)
obj = DRb.to_obj(ref)
if ((! obj.tainted?) && Thread.current[:drb_untaint])
Thread.current[:drb_untaint].push(obj)
end
return obj
end
self.new_with(uri, ref)
end
new(obj, uri=nil) Show source
创建一个新的远程对象存根。
obj
是我们要创建存根的(本地)对象。通常情况是这样nil
。uri
是将成为存根的远程对象的URI。
# File lib/drb/drb.rb, line 1093
def initialize(obj, uri=nil)
@uri = nil
@ref = nil
if obj.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) Show source
给定远程主机uri
和对象的参考信息,创建一个DRb :: DRbObject ref
。
# File lib/drb/drb.rb, line 1069
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) Show source
仅从一个URI创建一个新的DRbObject。
# File lib/drb/drb.rb, line 1077
def self.new_with_uri(uri)
self.new(nil, uri)
end
公共实例方法
__drbref() Show source
获取对象的引用,如果是本地的。
# File lib/drb/drb.rb, line 1112
def __drbref
@ref
end
__drburi() Show source
获取远程对象的URI。
# File lib/drb/drb.rb, line 1107
def __drburi
@uri
end
_dump(lv) Show source
Marshall表示这个项目.
对象的URI和ref被编组。
# File lib/drb/drb.rb, line 1084
def _dump(lv)
Marshal.dump([@uri, @ref])
end
method_missing(msg_id, *a, &b) Show source
将方法调用路由到引用的远程对象。
# File lib/drb/drb.rb, line 1132
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 lib/drb/drb.rb, line 1120
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