在if条件下用简写符号比较两个条件

时间:2018-02-01 23:57:44

标签: ruby

是否有写这两个逻辑条件的简写方法?

if array[index] > array[index - 1] && array[index] > array[index + 1]

类似于:

if array[index - 1] < array[index] > array[index + 1]

2 个答案:

答案 0 :(得分:1)

显然,如果您尝试执行if array[index - 1] < array[index] > array[index + 1],则会收到未定义的方法错误,因为您在FalseClass对象中使用>,并且此类不会出现这种情况。 t实现也不是<也不是>方法。所以,你会有类似的东西:

if true > array[index + 1]
  ...
end
# undefined method `>' for true:TrueClass (NoMethodError)

这适用于任何&#34;单身&#34;试图完成比较任何一方的对象。

array[index] > array[index - 1] && array[index] > array[index + 1]

这可以解释为验证,如果两个或所有对象都小于array[index],所以我猜你可以使用Enumerable#all?,它比较数组中的所有元素并返回true在块内进行比较,如果&#34; all&#34;元素满足它。

如果您出于某种原因需要在比较中添加更多元素,并且不关心它所创建的复杂逻辑,那么这将是一种替代方案。

所以,像这样的东西可以写成:

p 'foo' if [array[index - 1], array[index + 1]].all? { |element| element < array[index] }

p 'foo' if array[index] > array[index - 1] && array[index] > array[index + 1]

最终会有更多代码,但是如果你需要在表达式中添加一些东西,那么它就会在数组内部进行。

答案 1 :(得分:0)

我能想到的最接近的是:

if [array[index - 1], array[index], array[index + 1]].max == array[index]

编辑:或使用添加到同一方法中的范围选择:

if array[index-1..index+1].max == array[index]