2010-01-27 53 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