【问题标题】:passing child class method as function argument in ruby在ruby中将子类方法作为函数参数传递
【发布时间】:2015-05-01 07:22:45
【问题描述】:

有一个 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 会引发错误。如何将子类方法作为函数参数传递给另一个类。

【问题讨论】:

    标签: ruby ruby-on-rails-3


    【解决方案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 的值,这可能会有所帮助。

    【讨论】:

    • 嗨,Alex,非常感谢您的回答。 auto_update 方法是测试人员在 Testcase 类中编写的用户定义方法。 “type”的值是 auto_update 方法中的函数参数。 “type”的值必须替换为在另一个名为 LineItem 的类中编写的所有方法/函数名称。 LineItem 是 Commerce 类中的一个类。
    • 那么,目标是拥有一个可用于测试 LineItem 类中的多个方法的方法吗?如果是这种情况,我认为一个块(或者可能是一个 Proc)仍然是你最好的选择。正如我在回答中提到的那样,传递一个“函数参数”,然后在新的接收器上调用它在 Ruby 中有点麻烦。我建议您查看其中一些答案以获取更多信息:stackoverflow.com/q/522720/4280232
    【解决方案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)

    这仍然有点乱,这是可怕的代码。

    这里似乎还涉及“子类”。

    【讨论】:

    • 谢谢 Jrochkind。我对红宝石非常陌生,并试图探索不同的事物。非常感谢您的回答。我不知道为什么它很可怕?
    猜你喜欢
    • 2016-11-02
    • 2010-10-06
    • 1970-01-01
    • 2010-10-01
    • 2015-04-07
    • 1970-01-01
    • 2014-04-09
    • 2013-09-11
    • 2013-08-10
    相关资源
    最近更新 更多