Ruby 2.4

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是我们要创建存根的(本地)对象。通常情况是这样niluri是将成为存根的远程对象的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