2010-01-27 52 views
1

编辑:为了清楚起见,我试图用这个kind of generator(即用'yield'语句)而不是Rails生成器。在Rails(而不是Rails :: Generator)中使用Ruby生成器的错误

我有一个Rails项目中的以下(简化)初始化mixin,我可以使用一些帮助。我想要做的是创建一个生成器来跟踪Twitter API调用(这只是为了调试,我知道rate_limit_status)。

require 'generator' 
# Be sure to restart your server when you modify this file. 
module TwitterMixin 
    def get_auth 
    @auth ||= Twitter::HTTPAuth.new(ENV['TWITTER_USER'], ENV['TWITTER_PASS']) 
    end 
    def count 
    @counter ||= generator.new 
    @counter.yield 
    end 
    def client 
    p "#{count} Twitter API calls this iteration" 
    @client ||= Twitter::Base.new(get_auth) 
    end 
end 

的问题是,我发现了以下错误:

dlopen(/Users/john/.gem/ruby/1.8/gems/json-1.2.0/ext/json/ext/generator.bundle, 9): no suitable image found. Did find: 
/Users/john/.gem/ruby/1.8/gems/json-1.2.0/ext/json/ext/generator.bundle: mach-o, but wrong architecture - /Users/john/.gem/ruby/1.8/gems/json-1.2.0/ext/json/ext/generator.bundle 

这似乎是使用JSON发电机,这可能是一个更封闭范围的冲突。 主要问题是如何确保一个Ruby标准库类(特别是生成器类)被调用?

我还是Ruby的新手,顺便说一下,搜索“Rails中的生成器”相当占优于Rails :: Generator,所以这可能相当明显。此外,我愿意为我可能错过的这个问题提供更优雅的解决方案。谢谢。

+0

生成器是Ruby 1.8标准库的一部分,如果有任何用处,那么http://ruby-doc.org/stdlib/libdoc/generator/rdoc/index.html上有一些文档。但它不在1.9,但我还没有完全明白为什么。 – 2010-01-27 19:03:28

+0

我想这是因为你可以直接使用yield吗?不知道你如何继承它。可能只是将构建良率转化为像Python这样的类的方法。 – JohnMetta 2010-01-28 04:34:42

回答

0

让我拒绝我刚才的答复,并说,这是相当愚蠢的我用“屈服”的思想,这是内建类似Python的yield语句生成。我今天在第一个关于Ruby块的会议上了解到了。因此,我认为我仍然在寻求解决这个问题的办法。

+0

选择这个作为答案,因为在了解了Ruby的更多信息(在这个问题上大约一周的时间)之后,我意识到我在问错误的问题。 – JohnMetta 2010-02-08 19:19:29

1

你的系统上有一个叫做“发生器”的红宝石吗?这听起来像红宝石根据您的要求找到宝石有困难。如果您使用的是Rubigen发生器,那么您需要:

require 'rubigen' 

等等。请尝试运行:

gem list generator 

如果它没有提取任何东西,那么您可能是以错误的名称调用了库。

+0

没有意识到我不得不使用一个宝石,我认为这将是一个标准的库类,如:http://www.ruby-doc.org/core/classes/Generator.html也许我误解了关于标准库的一些事情? – JohnMetta 2010-01-27 17:25:48

+0

哦,我现在看到这可能是更多与Rails :: Generator的名称冲突,这就是为什么我找不到任何解决方案搜索。 – JohnMetta 2010-01-27 17:27:35

0

您不必构建一个生成器,您可以直接使用yield方法,这是我没有意识到的。此代码有效。

# Be sure to restart your server when you modify this file. 
module TwitterMixin 
    def get_auth 
    @auth ||= Twitter::HTTPAuth.new(ENV['TWITTER_USER'], ENV['TWITTER_PASS']) 
    end 
    def count 
    @num ||= 0 
    while true 
     num += 1 
     yield num 
    end 
    end 
    def client 
    p "#{count} Twitter API calls this iteration" 
    @client ||= Twitter::Base.new(get_auth) 
    end 
end