Я создаю класс для обертывания SOAP-соединения Savon следующим образом:
class SOAPConnection
attr_reader :url, :namespace
def initialize(url, namespace)
@url = url
@namespace = namespace
@client = Savon::Client.new do
wsdl.endpoint = @url
wsdl.namespace = @namespace
end
end
end
Этот код не работает.Инициализированный документ wsdl имеет конечную точку nil и пространство имен nil.
Чтобы заставить код работать, я должен использовать следующее:
class SOAPConnection
attr_reader :url, :namespace
def initialize(url, namespace)
@url = url
@namespace = namespace
@client = Savon::Client.new do
wsdl.endpoint = url # <=== use local variable
wsdl.namespace = namespace # <=== use local variable
end
end
end
Обратите внимание, что при настройке wsdl.endpoint и wsdl.namespace Я использую локальные переменные url и namespace, а не переменные экземпляра @url и @namespace.
Таким образом, кажется, что при передаче блока для инициализации документа wsdl контекстлокальные переменные сохраняются, а контекст переменных экземпляра - нет.Это фундаментальное поведение Ruby?