2016-03-14 22 views
1

我有一個散列:symbols => values,其值將是一個fixnum或布爾值。我必須運行一個循環,調用每個(&:符號)以在主要參數上調用。如何設置一個proc只爲了在Ruby中創建一個條件才能運行?

默認哈希我工作是:

default_options = { 
     :times => 1, 
     :upcase => false, 
     :reverse => false, 
    } 

而且我用給他們打電話循環,假設我已經通過了一個選項哈希通過方法來改變默認設置之一,合併它們。

hash.each do |key,val| 
     unless hash[key] == default_options[key] 
      result = key.to_proc.call(string) 
     end 
    end 

所以基本上,如果我通過一個選項散列,改變了默認值,它應該運行每個過程。如果我通過:times => 5,它應該打印字符串5次,如果我把:upcase => true等打印在選項散列中,它應該打印出來。那麼如何以符號形式寫出proc來接收參數,或者使布爾證明成立呢?

+1

恐怕我不明白你最後一句話的任何一部分。另外,在你的第二個代碼塊中,'string'和'val'應該是相同的嗎? –

+1

我不確定你會在這裏生成什麼代碼,因爲'times'和'upcase'不能正確鏈接。 – tadman

+0

它看起來像你正在試圖在塊中做太多事情。我會稍微打破目標,長時間做每一步,然後在看到機會時重新考慮它。但不要試圖預先優化解決方案。例如1.合併默認值,2.在字符串上運行合併選項。 – james2m

回答

0

這將做我認爲你想要的東西,但你不應該像我一樣去搞亂String(只是添加時間方法)。

String.instance_exec { alias_method :times, :* } 

def do_it(string, **options) 
    default_options = { 
    times: 3, 
    upcase: false, 
    reverse: false, 
    } 

    default_options.merge(options).each do |key, value| 
    if value 
     string = value == true ? string.public_send(key) : string.public_send(key, value) 
    end 
    end 

    string 
end 

注意,我沒有在這裏使用to_proc,因爲調用方法更簡單。

相關問題