Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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 如何只选择一个操作符,而不是在循环中重复测试?_Ruby - Fatal编程技术网

Ruby 如何只选择一个操作符,而不是在循环中重复测试?

Ruby 如何只选择一个操作符,而不是在循环中重复测试?,ruby,Ruby,以下是我试图重构的内容: items.each_与_索引do| item,ndx| 如果边==:左 条件=ndx=max 结束 结果(u)项目= 结束 items.each_与_索引do| item,ndx| 结果项目检查“proc”和“lambda”。它们使您能够保存对匿名函数的引用,例如: [4] pry(main)> func = proc {|left, right| left < right} => #<Proc:0x34c83c0@(pry):4>

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

items.each_与_索引do| item,ndx|
如果边==:左
条件=ndx<最大值
其他的
条件=ndx>=max
结束
结果(u)项目=
结束
items.each_与_索引do| item,ndx|
结果项目检查“proc”和“lambda”。它们使您能够保存对匿名函数的引用,例如:

[4] pry(main)> func = proc {|left, right| left < right}
=> #<Proc:0x34c83c0@(pry):4>

[5] pry(main)> func.call(4,5)
=> true

[6] pry(main)> func.call(5,2)
=> false

我没有检查代码,可能有一些输入错误。

运算符只是方法:

ndx.public_send(:<=, max)

(如果你仍然坚持使用1.8,你将不得不使用
send
而不是
public\u send

如果我理解你的意图,另一种方法可能是使用
take
drop

result_items = if side == :left
    items.take max
else
    items.drop max
end

如果您可以稍微调整一下此逻辑,您也可以实现相同的功能,如:

items.each_with_index do |item, ndx|
  # assuming it to be Fixnum since you are using index value
  result_items << item if (max - ndx).abs >= 0
end
items.each_与_索引do| item,ndx|
#假设它是Fixnum,因为您使用的是索引值
结果\u项=0
结束

在Ruby 1.9或更高版本上对问题的最佳直接回答,您应该真正养成使用
public\u send
而不是
send
来匹配正常方法调用行为的习惯(即不绕过
private
)。否则,在存在
private
方法的情况下,重构后的循环将具有与原始循环不同的行为。最佳重构。谢谢
result_items << item if ndx.public_send(oper, max)
result_items = if side == :left
    items.take max
else
    items.drop max
end
items.each_with_index do |item, ndx|
  # assuming it to be Fixnum since you are using index value
  result_items << item if (max - ndx).abs >= 0
end