次のように、SavonSOAP接続をラップアラウンドするクラスを作成しています。
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と名前空間の変数を使用していることに注意してください。
したがって、ブロックを渡してwsdlドキュメントを初期化する場合、ローカル変数のコンテキストは保持されますが、インスタンス変数のコンテキストは保持されないようです。これはRubyの基本的な動作ですか?