将子类方法作为函数参数传递给ruby

时间:2015-02-28 17:04:20

标签: ruby ruby-on-rails-3

有一个类Commerce,它的构造函数将初始化一个名为commerce的对象。 LineItem是Commerce类中的类。 LineItem类有一个名为" ssm"的方法。当这种方法" ssm"被调用它将初始化另一个名为SSM的类的对象。在我们的问题中,我们需要传递给" ssm"方法作为另一个Test类中的函数参数。

 def autoUpdate(docNum, type, varName, value)
   type = method(Commerce::LineItem:ssm)
  commerce.line_item.type(varName).set(value)
end

在函数参数' type'的位置,应该用LineItem类中的不同方法名称替换它。但是上面的函数autoUpdate会抛出错误。如何将子类方法作为函数参数传递给另一个类。

2 个答案:

答案 0 :(得分:2)

我认为你所做的可能是一个错误和一个糟糕的设计,但对于你的具体问题,如果你真的想要一个方法对象,我想你想要:

type_method = Commerce::LineItem.instance_method(:ssm)

然后您可以通过以下方式调用它:

bound_type_method = comerce.line_item.bind(type_method).call(varName).set(value)

但这并没有多大意义。您也可以只传递符号method_name = :ssm,然后调用commerce.line_item.type.send(method_name, varName).set(value)

但是,这仍然是一团糟,这是一个可怕的代码。

此外,似乎还有一些儿童班'涉及到这里。

答案 1 :(得分:1)

将方法作为参数传递并更改其接收器在Ruby中并不像在Javascript中那样容易,也不像传统的那样。相反,通常在需要完成此类事情时,Ruby约定是使用块。例如。如果您像这样定义了auto_update方法

def auto_update(doc_num, var_name, value)
  raise ArgumentError, "Block is required." unless block_given?

  line_item = yield var_name
  line_item.set(value)
end

然后你可以这样称呼它

auto_update(doc_num, var_name, value) do |var_name|
  commerce.line_item.ssm(var_name)
end

当然,由于多种原因(例如,为什么不先调用块的内容然后将结果作为auto_update的参数传递),这看起来非常愚蠢。如果您更多地描述您的设计,特别是从调用此auto_update方法的位置以及确定type的值的方式,这可能有所帮助。