2012-05-03 60 views
0

我想以更類似於Ruby的風格編寫Ruby代碼,並在使用參數傳遞時遇到問題。我想看看ABC是不是零。如果ABC是零,我會傳遞另一個符號到dosomething,如果不是,我會傳遞另一種類型的哈希值來計算。如何爲傳遞鍵值參數編寫更好的代碼?

由於Ruby不像Java,它可以傳遞不同類型的參數(不同的鍵)。

如何讓下面的代碼更漂亮?

合併do_manythingdo_otherthingsdo_manythings_again成一個單一的功能是沒有答案的我,因爲我會打電話dosomething在我的代碼中的許多地方:

if ABC.nil? 
Apple.dosomething (:foo => DEF) { |a| 
    a.do_manything 
    a.do_otherthings 
    a.do_manythings_again 
} 
else 
Apple.dosomething (:bar => ABC) { |a| 
    a.do_manything 
    a.do_otherthings 
    a.do_manythings_again 
} 
end 
+0

除非'ABC'可以是'nil'和'false'(所以你需要告訴另一個),這不是慣用的寫一個明確的'.nil?'檢查。 – tokland

回答

2

您可以切換散列發送:

opts = ABC.nil? ? {foo:DEF} : {bar:ABC} 
Apple.dosomething(opts) do |a| 
    do_many_things 
    do_other_things 
    do_many_things_again 
end 

...或者你可以傳遞一個lambda作爲塊:

stuff_to_do = ->(a) do 
    do_many_things 
    do_other_things 
    do_many_things_again 
end 

if ABC.nil? 
    Apple.dosomething(foo:DEF,&stuff_to_do) 
else 
    Apple.dosomething(bar:ABC,&stuff_to_do) 
end 
0

你可以這樣做:

options = if ABC.nil? then { foo: DEF } else { bar: ABC } end 

Apple.do_something options do |apple| 
    apple.instance_eval do 
    do_many_things 
    do_other_things 
    do_many_things_again 
    end 
end 

按照慣例,名稱和標識符中的單詞用下劃線分隔(_),do/end用於多行塊。

此外,我相信這個問題屬於Code Review

3

使用三元運算符。

Apple.dosomething (ABC.nil? ? {foo:DEF} : {bar:ABC}) do |a| 
    a.do_manything 
    a.do_otherthings 
    a.do_manythings_again 
end 

這裏是格式 condition ? return_if_true : return_if_false

+0

在代碼審查中,我認爲將三元語句放在方法調用中並不是很好的做法。 –

+0

因爲它讓閱讀變得更難?或... –

+2

是的。難以閱讀/更復雜 - 儘管我們可以這樣寫,但考慮到長期維護或其他人在遇到它時會這樣想。任何時候我們不得不停下來解析我們腦海中的代碼,我們就會增加發生錯誤的機率。這個特殊用途是相當安全的,因爲它是一個簡單的例子。想象一下帶有一堆參數的方法,或者使用三元賦值的大型哈希初始化,而不是一種方法,並找到一種可讀性和簡潔性的快樂媒介。 –