2013-12-09 49 views
2

我想映射一個來自Twitter API的枚舉器。我可以使用test.map(&:attrs)成功映射整個枚舉,但是我可以映射特定的字段,但是當我嘗試映射id_str字段時,出現未定義的方法錯誤。我無法弄清楚我的語法是否關閉或者是否有其他考慮。Twitter id_str未定義的方法Ruby中的#map錯誤

下面是我的示例代碼和輸出:

print "original output\n" 
print test.map(&:attrs) 

print "\n\nmap a few fields\n" 
print test.map { |e| { id: e.id, 
         name: e.name, 
         screen_name: e.screen_name 
         }} 
print "\n\nid_str seems to return a undefined method\n"      
print test.map { |e| { id: e.id, 
         id_str: e.id_str, 
         name: e.name, 
         screen_name: e.screen_name 
         }} 

生成以下的輸出:

original output 
[{:id=>78194111, :id_str=>"78194111", :name=>"Chelsea Peretti", :screen_name=>"ChelseaVPeretti", :location=>"Los Angeles", :description=>"One of the greats!", :url=>"http://t.co/3rRz8qGpeW", :entities=>{:url=>{:urls=>[{:url=>"http://t.co/3rRz8qGpeW", :expanded_url=>"http://www.chelseaperetti.com", : 
display_url=>"chelseaperetti.com", :indices=>[0, 22]}]}, :description=>{:urls=>[]}}, :protected=>false, :followers_count=>249943, :friends_count=>740, :listed_count=>4277, :created_at=>"Tue Sep 29 02:35:35 +0000 2009", :favourites_count=>33016, :utc_offset=>-28800, :time_zone=>"Pacific Time (US & Ca 
nada)", :geo_enabled=>true, :verified=>true, :statuses_count=>14958, :lang=>"en", :status=>{:created_at=>"Mon Dec 09 00:40:48 +0000 2013", :id=>409845047744409600, :id_str=>"409845047744409600", :text=>"Really looking forward to spending half my life in an apple store", :source=>"<a href=\"http://tw 
itter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>", :truncated=>false, :in_reply_to_status_id=>nil, :in_reply_to_status_id_str=>nil, :in_reply_to_user_id=>nil, :in_reply_to_user_id_str=>nil, :in_reply_to_screen_name=>nil, :geo=>nil, :coordinates=>nil, :place=>nil, :contributors=>ni 
l, :retweet_count=>13, :favorite_count=>77, :entities=>{:hashtags=>[], :symbols=>[], :urls=>[], :user_mentions=>[]}, :favorited=>false, :retweeted=>false, :lang=>"en"}, :contributors_enabled=>false, :is_translator=>false, :profile_background_color=>"022330", :profile_background_image_url=>"http://a0 
.twimg.com/profile_background_images/777102099/405580aee5a6a6d3f4d608b5bc488149.jpeg", :profile_background_image_url_https=>"https://si0.twimg.com/profile_background_images/777102099/405580aee5a6a6d3f4d608b5bc488149.jpeg", :profile_background_tile=>true, :profile_image_url=>"http://pbs.twimg.com/pro 
file_images/378800000812827132/fe8566998e61c0f3e1275af4953a22e9_normal.jpeg", :profile_image_url_https=>"https://pbs.twimg.com/profile_images/378800000812827132/fe8566998e61c0f3e1275af4953a22e9_normal.jpeg", :profile_banner_url=>"https://pbs.twimg.com/profile_banners/78194111/1382904580", :profile_l 
ink_color=>"0084B4", :profile_sidebar_border_color=>"FFFFFF", :profile_sidebar_fill_color=>"C0DFEC", :profile_text_color=>"333333", :profile_use_background_image=>true, :default_profile=>false, :default_profile_image=>false, :following=>false, :follow_request_sent=>false, :notifications=>false}] 

map a few fields 
[{:id=>78194111, :name=>"Chelsea Peretti", :screen_name=>"ChelseaVPeretti"}] 

id_str seems to return a undefined method 
C:/RailsInstaller/AppCode/first attempt at graph.rb:142:in `block in <main>': undefined method `id_str' for #<Twitter::User:0x2b602f0> (NoMethodError) 
     from C:/RailsInstaller/AppCode/first attempt at graph.rb:141:in `map' 
     from C:/RailsInstaller/AppCode/first attempt at graph.rb:141:in `<main>' 

回答

1

很新,與紅寶石自己的Twitter的API玩,但事實證明,id_str ISN在你試圖枚舉的Ruby對象上使用方法。運行一個特定的快速檢查,如test.first.methods將證實這一點。

這意味着您不能使用點符號訪問id_str。然而,它是由test.map(&:attrs)返回的哈希值的關鍵,所以你可以通過這樣修改你上面的代碼:

print test.map { |e| { id: e.attrs[:id], 
         id_str: e.attrs[:id_str], 
         name: e.attrs[:name], 
         screen_name: e.attrs[:screen_name] 
       }} 

如果您在使用點符號死心塌地,你可以很容易的每個哈希對象轉換成OpenStruct像這個:

friends = test.map { |f| OpenStruct.new(f.attrs) } 

然後你可以簡單地做friends.map(&:id_str)

我認爲混亂在於上面的示例代碼。在第一行中,您的輸出是散列數組。但是你映射的是一組Twitter::User對象。前者有id_str作爲關鍵,但後者沒有這樣的方法。

相關問題