if array1.present?
method_call(array1[:ids])
end
if array2.present?
method_call(array2[:ids])
end
上記コードをもっと簡単にするか、1行にするか?以下の2つのif条件をマージする方法は?
if array1.present?
method_call(array1[:ids])
end
if array2.present?
method_call(array2[:ids])
end
上記コードをもっと簡単にするか、1行にするか?以下の2つのif条件をマージする方法は?
[array1, array].select(&:present?)
.map { |a| a[:ids] }
.each(&method(:method_call))
ルビーでこのようなことを行う方法はたくさんあります。ここでは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
が有効な指標ではないことを指摘しなければならないけど。それらがハッシュである場合、この例はより理にかなっています。
'[] .present? == [] ''#⇒偽の場合はtrueです。セマンティクスも変更しました。 – mudasobwa
これは、私はそれを読み、理解するのは簡単ですので、あなたのコードは完全に罰金だと思う同じことが、単純なビット、
[array1, array2].each do |a|
method_call(a[ids]) if a.present?
end
ことができます。したがって、それを短くして改善するかどうかはわかりません。
並べ替えメソッドの呼び出しや条件
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)
'array1'が配列だった場合、' array1 [:ids] 'はエラーになります。 – Stefan
実際には2つのリストがそのまま残っています。これは現在の命題よりも読みやすいです。 – ndn