有一个类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会抛出错误。如何将子类方法作为函数参数传递给另一个类。
答案 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
的值的方式,这可能有所帮助。