使用Mail gem从块内部访问变量

时间:2013-01-23 23:01:32

标签: ruby variables

我在访问某些变量的内容时遇到问题。我正在使用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中访问变量,我想这将是一个类问题。

1 个答案:

答案 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}}