我在访问某些变量的内容时遇到问题。我正在使用Mail gem并拥有以下代码:
class Email
attr_accessor :server, :port, :username, :password, :ssl
def check_mail
# puts server ---> imap.googlemail.com ---> work
Mail.defaults do
# puts server ---> nil ---> not work
retriever_method :imap, address: server, #---> obviously not work
port: port,
user_name: username,
password: password,
enable_ssl: ssl
end
end
end
def account
acc = Email.new
acc.server = 'imap.googlemail.com'
acc.port = '993'
acc.username = 'xxx'
acc.password = 'xxx'
acc.ssl = 'true'
acc.check_mail
end
我无法从Mail.default do
中访问变量,我想这将是一个类问题。
答案 0 :(得分:2)
给出块Mail
的可能性是在另一个上下文中执行的,并且变量在该范围内不可用。这有时会发生在用Ruby编写的某些“域特定语言”(DSL)中。
您需要桥接您想要使用的任何数据。如果为配置创建命名空间,则可以这样做:
Mail.defaults do
retriever_method :...,
:address => MyModule.address,
# ...
end
如果您拥有mattr_accessor
,可以使用this = self
Mail.defaults do
retriever_method :...,
:address => this.address,
# ...
end
轻松创建这些模块。
也可以使用一种闭包来实现这一目标:
{{1}}