无法从Ruby中的do块访问实例var

时间:2013-07-20 06:02:33

标签: ruby

我有这个块用于配置Mail gem。

Mail.defaults do 
  retriever_method :imap, :address    => @mail_settings[:address],
                          :port       => @mail_settings[:port],
                          :user_name  => @mail_settings[:username], 
                          :password   => @mail_settings[:password],
                          :enable_ssl => @mail_settings[:enable_ssl]   
end

@mail_settings是可访问的,可以在do块之外读取,但不能在内部读取。我对ruby很新,所以我想了解原因。现在,我收到了这个错误(第66行是retrievever_method行):

main.rb:66:in `block in set_mail_defaults': undefined method `[]' for nil:NilClass (NoMethodError)

奇怪的是,这有效:

address     = @mail_settings[:address]
port        = @mail_settings[:port]
user_name   = @mail_settings[:username]
password    = @mail_settings[:password]
enable_ssl  = @mail_settings[:enable_ssl]

Mail.defaults do 
  retriever_method :imap, :address    => address,
                          :port       => port, 
                          :user_name  => user_name,  
                          :password   => password,
                          :enable_ssl => enable_ssl   
end

2 个答案:

答案 0 :(得分:1)

Mail.defaults正在阻止source code)上运行instance_eval。这意味着您查找的任何实例变量都将位于用作块实例的对象中。要解决此问题,请将实例变量的值分配给局部变量。

答案 1 :(得分:1)

Mail.defaults方法定义如下:

def self.defaults(&block)
    Configuration.instance.instance_eval(&block)
end

这意味着它评估Configuration的单例实例(Singleton包含Configuration模块)中的块,这不是您正在使用的类的上下文和{ {1}}居住。

要解决此问题,您可以定义一个本地变量来保存@mail_settings,以便您可以在块中访问它:

@mail_settings