Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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_Ruby On Rails 3 - Fatal编程技术网

在ruby中传递子类方法作为函数参数

在ruby中传递子类方法作为函数参数,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,有一个类Commerce,它的构造函数将初始化一个名为Commerce的对象。LineItem是Commerce类中具有的类。LineItem类有一个名为“ssm”的方法。当调用此方法“ssm”时,它将初始化另一个名为ssm的类的对象。在我们的问题中,我们需要在另一个测试类中作为函数参数传递给“ssm”方法 def autoUpdate(docNum, type, varName, value) type = method(Commerce::LineItem:ssm) commer

有一个类Commerce,它的构造函数将初始化一个名为Commerce的对象。LineItem是Commerce类中具有的类。LineItem类有一个名为“ssm”的方法。当调用此方法“ssm”时,它将初始化另一个名为ssm的类的对象。在我们的问题中,我们需要在另一个测试类中作为函数参数传递给“ssm”方法

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

在函数参数“type”的位置上,应该用与类LineItem不同的方法名替换。但是,上面的函数autoUpdate会引发错误。如何在另一个类中将子类方法作为函数参数传递。

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

type_method = Commerce::LineItem.instance_method(:ssm)
您可以通过以下方式调用它:

bound_type_method = comerce.line_item.bind(type_method).call(varName).set(value)
但这没有多大意义。您也可以只传递符号
method\u name=:ssm
,然后调用
commerce.line\u item.type.send(method\u name,varName).set(value)

这仍然有点混乱,这是一个可怕的代码


这里似乎也有“儿童班”

在Ruby中,将方法作为参数传递并更改它们的接收者不像在Javascript中那样容易,也不像传统的方法那样容易。相反,通常当需要做这类事情时,Ruby约定是使用块。例如,如果您这样定义了自动更新方法

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
那么你可以这样称呼它

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\u update
的参数传入)。如果您更详细地描述一下您的设计,特别是从调用此自动更新方法的位置以及如何确定
type
的值,这可能会有所帮助。

谢谢。我对ruby非常陌生,并尝试探索不同的东西。非常感谢你的回答。我不知道为什么这么可怕?嗨,亚历克斯,非常感谢你的回答。auto_update方法是由测试人员在Testcase类中编写的用户定义的方法。“type”的值是自动更新方法中的函数参数。“type”的值必须替换为另一个名为LineItem的类中编写的所有方法/函数名。LineItem是Commerce类中的一个类。那么,我们的目标是使用一个方法来测试LineItem类中的多个方法吗?如果是这样的话,我认为阻塞(或者可能是进程)仍然是你最好的选择。正如我在回答中提到的,传递一个“函数参数”,然后在新的接收器上调用它在Ruby中有点麻烦。我建议您查看以下一些答案以了解更多信息: