class DRb::DRbObject
Объект, оборачивающий ссылку на удалённый объект drb.
Вызовы методов к этому объекту перенаправляются на удалённый объект, для которого этот объект является псевдонимом.
Публичные Классовые Методы
# File lib/drb/drb.rb, line 1053
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 Распаковывает сериализованный DRbObject.
Если ссылка на объект находится на локальном сервере, то возвращается сам объект. В противном случае создаётся новый DRbObject для работы в качестве псевдонима удалённого объекта.
# File lib/drb/drb.rb, line 1094
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 Создаёт новый псевдоним удалённого объекта.
obj — это (локальный) объект, для которого нужно создать псевдоним. Обычно это nil. uri — URI удалённого объекта, для которого этот псевдоним будет создан.
# File lib/drb/drb.rb, line 1070 def self.new_with(uri, ref) it = self.allocate it.instance_variable_set(:@uri, uri) it.instance_variable_set(:@ref, ref) it end
Создаёт DRb::DRbObject на основе сведений о ссылке на удалённый хост uri и объекте ref.
Публичные Методы Экземпляров
# File lib/drb/drb.rb, line 1113 def __drbref @ref end
Получает ссылку на объект, если он локальный.
# File lib/drb/drb.rb, line 1108 def __drburi @uri end
Получает URI удалённого объекта.
# File lib/drb/drb.rb, line 1085 def _dump(lv) Marshal.dump([@uri, @ref]) end
Сериализует этот объект.
URI и ссылка на объект сериализуются.
# File lib/drb/drb.rb, line 1133
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 Перенаправляет вызовы методов на удалённый объект-референцию.
# File lib/drb/drb.rb, line 1121
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 Перенаправляет respond_to? на удалённый объект-референцию.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.