以下是我试图重构的内容:

items.each_with_index do |item, ndx|
  if side == :left
    condition = ndx < max
  else
    condition = ndx >= max
  end

  result_items << item if condition
end

我希望能够将if/else/end移到块外部,因为side的值在块内部不会改变。因为基于side值的唯一变化是运算符,所以我希望能够执行如下操作:
if side == :left
  oper = <
else
  oper = >=
end

items.each_with_index do |item, ndx|
  result_items << item if ndx oper max
end

但当然,因为语法的原因,这是行不通的。
有没有什么方法可以储存一个接线员,或者更好的方法来完成我的任务?

最佳答案

运算符只是方法:

ndx.public_send(:<=, max)


ndx <= max

所以在循环外设置oper到所需运算符的符号,在循环内设置send到所需运算符的符号
result_items << item if ndx.public_send(oper, max)

(如果您仍然停留在1.8上,则必须使用public_send而不是)

08-05 23:59