我有一个初始值x
和一个运算符列表,称之为op1
,op2
,op3
等。
我想要计算的值是op1(op2(op3(x)))
。运营商的数量是可变的。 Ruby最方便的做法是什么?
以下是代码中的示例:
class Op1
def operate arg
arg + 1
end
end
class Op2
def operate arg
arg + 2
end
end
x = 1
Op1.new.operate(Op2.new.operate(x))
=> 4
答案 0 :(得分:1)
使用reduce。 e.g。
def a1(v)
"#{v} 1"
end
def a2(v)
"#{v} 2"
end
def a3(v)
"#{v} 3"
end
puts [:a1, :a2, :a3].reverse.reduce("hi"){|memo, obj|
self.send(obj, memo)
}
# gives "hi 3 2 1"
在您的情况下,请致电:
[Op1, Op2].reverse.reduce(x){|memo,obj| obj.new.operate(memo)}
答案 1 :(得分:-1)
这是另一种方式。
<强>代码强>
methods = [[Op1, :operate1], [Op1, :operate1], ...]
def compound(methods, x)
methods.size.times { c,m = methods.pop; x = c.send(m,x) }
x
end
我假设:operate1
和:operate2
是类方法。问题涉及实例方法。那些可以通过创建类的实例来调用,但由于这些实例没有进一步的使用,我没有看到太多的意义。
如果methods
不被修改,请在methods
的副本上操作。
示例强>
class Op1
def self.operate arg
arg + 1
end
end
class Op2
def self.operate arg
arg + 2
end
end
methods = [[Op1, :operate], [Op2, :operate]]
compound(methods, 1)
#=> 4