重構此條件的任何提示?檢查多哈希鍵是否存在
params = {:p1=>"foo", :p2=>true, :p3=>nil, :pN=>""}
if params[:p1].present? && params[:p2].present? && params[:pN].present?
# do something...
重構此條件的任何提示?檢查多哈希鍵是否存在
params = {:p1=>"foo", :p2=>true, :p3=>nil, :pN=>""}
if params[:p1].present? && params[:p2].present? && params[:pN].present?
# do something...
事情是這樣的:
params.values_at(:p1, :p2, :pN).all?(&:present?)
if params.values_at(*%i[p1 p2 p3]).all?(&:present?)
values_at
返回您提供的每個鍵的值的Array
。 all?
是true
如果謂詞(present?
)爲true
爲可枚舉的每個成員。 values_at
將包括nil
爲一個丟失的關鍵(而不是省略它),所以你不必擔心數組摺疊到只有現值。
keys = [:p1, :p2, :pN]
puts "hi" if keys.all? { |k| params[k].present? }
這具有儘快params[k].present?
是false
終止散列查詢的優點。
除了'keys',我們可以使用'params.keys',因爲'params'是一個散列。如果我沒有弄錯,OP似乎在檢查所有鍵是否有值'現在?'。 –
@Wand,OP似乎並不關心':p3'。 –
我明白了。雖然奇怪! –
重構請求在這裏有些偏離主題。有一個網站:http://codereview.stackexchange.com –
只是一個觀點,Code Review只需要**真實的**代碼。 「Foo」,「Bar」等會在幾秒鐘內關閉。如果您在某個實際項目中存在該條件,請發佈實際代碼。 – Kaz
爲什麼'p3'沒有在'if'條件中被檢查?你對所有按鍵的數值不感興趣,但只有少數幾個?另外,爲什麼你在'params [「p1」]'中使用字符串'「p1」',當鍵實際上是一個符號':p1'時 - 兩者都不相同。 –