2010-03-19 46 views
3

我有一個Ruby方法用於搜索哈希數組並返回該數組的子集。如何確保方法返回一個數組,即使在Ruby中只有一個元素時

def last_actions(type = 'all') 
    actions = @actions 

    if type == 'run' 
     actions = actions.select {|a| a['type'] == "run" } 
    end 

    return actions 

    end 

這工作,除非只有一個返回動作,在這種情況下,我不認爲這是一個元素返回一個數組,只是元素本身。 這會在以後出現問題。

在這種情況下,確保它返回1個元素的數組的最佳方法是什麼?

謝謝。

+0

也許你能告訴產生的示例和錯誤? – ideasasylum 2010-03-19 15:25:44

回答

2

select總是返回一個數組(除非塊內有break,否則不會)。所以無論你的代碼出了什麼問題,這都不是原因。

當然,如果@actions不包含數組(或其他類型的Enumerable),那麼對select的調用將導致異常,並且該方法根本不會返回任何內容。在這種情況下,解決方案將確保@actions總是返回一個數組。如何做到這一點取決於你在哪裏/如何設置@actions

+0

你說得很對。我後來用.last處理了返回值,這是罪魁禍首。謝謝。 – doctororange 2010-03-19 15:49:40

1

你的觀察是人比怪多,不過你可以試試這個:

def last_actions(type = 'all') 
    actions = @actions.dup || [] 
    actions.delete_if {|a| a['type'] != "run" } if type == 'run' 
    actions 
end 
14

請注意,有一個很好的清潔紅寶石成語來確保單一對象和數組被視爲數組:

a = [1,2,3] 
b = 4 

[*a] 
=> [1, 2, 3] 

[*b] 
=> [4] 
+2

+1爲涼爽因子 – hurikhan77 2010-03-20 00:04:59

+0

輝煌,謝謝。 – vfilby 2012-09-27 01:26:06

+1

無法正確使用散列: irb(main):001:0> a = {id:1} => {:id => 1} irb(main):002:0> [* a] => [[:id,1]] irb(main):003:0> [a] => [{:id => 1}] irb(main):004:0> – 2014-02-28 08:55:58

1

你也可以做這樣的:

a = [1,2,3] 
b = 4 

Array(a) 
=> [1, 2, 3] 

Array(b) 
=> [4] 
+0

與'[* a]'相同。無法正確使用哈希值:http://pastebin.com/aWNebnGj。所以最好使用普通的'a.kind_of?(Array)? a:[a]' – 2014-02-28 09:04:14

相關問題