類別 DRb::DRbObject

Object 包裝一個對遠端 drb 物件的參考。

Method 對此物件的呼叫會轉發給此物件作為其 stub 的遠端物件。

公開類別方法

_load(s) 按一下以切換來源

取消封送一個封送的 DRbObject

如果引用的物件位於本機伺服器中,則會傳回物件本身。否則,會建立一個新的 DRbObject 作為遠端引用的物件的 stub。

# File lib/drb/drb.rb, line 1051
def self._load(s)
  uri, ref = Marshal.load(s)

  if DRb.here?(uri)
    obj = DRb.to_obj(ref)
    return obj
  end

  self.new_with(uri, ref)
end
new(obj, uri=nil) 按一下以切換來源

建立一個新的遠端物件 stub。

obj 是我們想要建立 stub 的(本機)物件。通常為 niluri 是此物件將作為其 stub 的遠端物件的 URI

# File 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 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 lib/drb/drb.rb, line 1073
def self.new_with_uri(uri)
  self.new(nil, uri)
end

公開實例方法

__drbref() 按一下以切換來源

取得物件的參考(如果為本機物件)。

# File lib/drb/drb.rb, line 1115
def __drbref
  @ref
end
__drburi() 按一下以切換來源

取得遠端物件的 URI

# File lib/drb/drb.rb, line 1110
def __drburi
  @uri
end
_dump(lv) 按一下以切換來源

封送此物件。

封送物件的 URI 和 ref。

# File lib/drb/drb.rb, line 1080
def _dump(lv)
  Marshal.dump([@uri, @ref])
end
method_missing(msg_id, *a, &b) 按一下以切換來源
# File 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 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