2012-03-02 66 views
1

RuNubie这里。我有一个类Login,它使用net/IMAP库登录到Gmail。正在发生的事情是,我创建一个新的实例类,如:ruby​​可变范围跨类

a = Login.new("username", "gmail.com", "passw") 

然后,我工作的其他类,会做一些“东西”与该邮箱。问题是我在Login中定义的@imap变量似乎已经消失了(由于我设想的范围)。

这是@imap如何在登录类中声明: @imap = Net::IMAP.new('imap.gmail.com',993,true,nil,false)

所以这个:

@today = Date.today 
    @received_today = imap.search(["SINCE", @today.strftime("%d-%b-%Y")]).count.to_s 

...返回一个错误。这些是我在玩这个时遇到的两个错误。第一种是当我使用imap,第二个是当我尝试@imap

NameError: undefined local variable or method `imap' for #<Object:0x10718d2a8> 
NoMethodError: undefined method `search' for nil:NilClass 

哪些应对这样的情况下最好的做法是什么?是唯一的解决方案来定义我的方法,在创建Net :: IMAP的新实例的同一个类中执行“东西”?是宣布@imap作为一个全球变量$imap不好的做法?很困惑,我敢打赌,答案非常简单明显,但我只是没有看到它。谢谢!

回答

1

此:

@received_today = imap.search(["SINCE", @today.strftime("%d-%b-%Y")]).count.to_s 

将无法​​正常工作,因为,那里是在这一点上没有范围和imap所以你得到一个NameError。当您尝试这样的:

@received_today = @imap.search(["SINCE", @today.strftime("%d-%b-%Y")]).count.to_s 

你得到一个NoMethodError因为实例变量,如@imap,在第一次使用自动创建和初始化nil。您真实的@imap位于另一个对象中,因此您无法在其他任何地方将其称为@imap

我想你想的结构更是这样的:

class User 
    def imap 
     if([email protected]) 
      @imap = Net::IMAP.new('imap.gmail.com', 993, true, nil, false) 
      # and presumably an @imap.authenticate too... 
     end 
     @imap 
    end 
end 

class OtherOne 
    def some_method(user) 
     @today = Date.today 
     @received_today = user.imap.search(["SINCE", @today.strftime("%d-%b-%Y")]).count.to_s 
    end 
end 

让您Net::IMAP本地化您的用户里面,并让其他对象使用它提供了一个简单的访问方法。

哦,那个全球$imap的想法,我只是假装我没有看到,因为全局变量几乎总是一个非常糟糕的主意。

+0

谢谢!这是有道理的,所以基本上类User的实例被作为参数传递给OtherOne类的some_method,看起来像。我担心这种方式每当另一个类调用类User时,Net :: IMAP登录并验证邮箱。似乎它可能会变慢,如果许多其他类/方法不断试图“做东西”的邮箱,并且每次都必须登录。这听起来像是基于你的回答,没有办法只用net/IMAP登录并保持打开状态。 – krapdagn 2012-03-02 05:42:26

+1

@krapdagn:Net :: IMAP。new'只会被每个用户调用一次,之后'imap'只返回现有的'@ imap'。如果'@ imap'被断开连接,你可能需要重新连接一些逻辑。 – 2012-03-02 05:54:22

1

较短的方式来定义的用户类的IMAP变量,这是几乎一样的东西亩贴:

class User 
    def imap 
     @imap ||= Net::IMAP.new... 
    end 
end 
+0

谢谢。我喜欢Ruby如何通过多种方式来解决问题。很好学习像|| =这样的新东西 – krapdagn 2012-03-02 05:45:30