2017-09-07 15 views
0
if array1.present? 
    method_call(array1[:ids]) 
end 

if array2.present? 
    method_call(array2[:ids]) 
end 

上記コードをもっと簡単にするか、1行にするか?以下の2つのif条件をマージする方法は?

+4

'array1'が配列だった場合、' array1 [:ids] 'はエラーになります。 – Stefan

+1

実際には2つのリストがそのまま残っています。これは現在の命題よりも読みやすいです。 – ndn

答えて

1
[array1, array].select(&:present?) 
       .map { |a| a[:ids] } 
       .each(&method(:method_call)) 
0

ルビーでこのようなことを行う方法はたくさんあります。ここでは1です:

[array1, array2].compact.each do |array| 
    method_call(array[:ids]) 
end 

compactは、アレイのnilsアウトがかかります。また

...

[array1, array2].each do |array| 
    method_call(array[:ids]) if array 
end 

編集:ワンライナー?

[array1, array2].compact.each {|a| method_call(a[:ids]) } 

私はそれらが実際に配列されている場合は、:idが有効な指標ではないことを指摘しなければならないけど。それらがハッシュである場合、この例はより理にかなっています。

+0

'[] .present? == [] ''#⇒偽の場合はtrueです。セマンティクスも変更しました。 – mudasobwa

0

これは、私はそれを読み、理解するのは簡単ですので、あなたのコードは完全に罰金だと思う同じことが、単純なビット、

[array1, array2].each do |a| 
    method_call(a[ids]) if a.present? 
end 
0

ことができます。したがって、それを短くして改善するかどうかはわかりません。

  • 並べ替えメソッドの呼び出しや条件

    method_call(array1[:ids]) if array1.present? 
    method_call(array2[:ids]) if array2.present? 
    
  • :私は、コードを変更しなければならないとしたら

    は、私が思うだろう(おそらく私たちの例では、メソッド呼び出しや条件の長いリストのほんの一部です)

  • またはヘルパーメソッド導入:

    def call_method(array) 
        method_call(array[:ids]) if array.present? 
    end 
    
    call_method(array1) 
    call_method(array2) 
    
関連する問題