我有这个块用于配置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
答案 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