在Ruby上操作并更新值?

时间:2014-09-29 04:48:54

标签: ruby

我有一个初始值x和一个运算符列表,称之为op1op2op3等。

我想要计算的值是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

2 个答案:

答案 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