Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何合并以下两个if条件?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何合并以下两个if条件?

Ruby on rails 如何合并以下两个if条件?,ruby-on-rails,ruby,Ruby On Rails,Ruby,如何使上述代码更加简单或一行?在ruby中有很多方法可以实现这类功能。这里有一个: if array1.present? method_call(array1[:ids]) end if array2.present? method_call(array2[:ids]) end compact将nils从数组中取出 或者 [array1, array2].compact.each do |array| method_call(array[:ids]) end 编辑:一行 [ar

如何使上述代码更加简单或一行?

在ruby中有很多方法可以实现这类功能。这里有一个:

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

if array2.present?
  method_call(array2[:ids])
end
compact
nils
从数组中取出

或者

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

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

尽管我应该指出,如果这些实际上是数组,那么
:id
不是有效的索引。如果它们是散列,那么这个例子就更有意义了。

这可能是相同的,但要简单一点

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

我认为您的代码非常好,因为它易于阅读和理解。因此,我不确定是否可以通过缩短它来改善

如果我必须更改代码(也许我们的示例只是方法调用和条件列表的一部分)我会考虑:

  • 重新排序方法调用和条件

    [array1, array].select(&:present?)
                   .map { |a| a[:ids] }
                   .each(&method(:method_call))
    
  • 或引入助手方法:

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

如果
array1
是一个数组,那么
array1[:ids]
将导致错误。如果只是两个列表,则保持原样。这种方式比当前的命题更具可读性。
[]当前?==如果[]
#⇒ 错误
。您还更改了语义。
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)