ruby注入方法作为参数

ruby注入方法作为参数,ruby,Ruby,因此,我试图编写功能性ruby,为此需要在需要的地方注入lambdas。但事实证明,这并不是那么优雅和有用。例如: def this_is_a_test(arg1, fn_one = self.default_fn_one, fn_two = self.default_fn_two) #Something here end 这有两个缺点: 如果我需要注入更多的方法,arity就会变得太大 如果我只想注入fn_-two,并为fn_-one使用默认值,那是不可能的 所以我尝试了这种方法(从ra

因此,我试图编写功能性ruby,为此需要在需要的地方注入lambdas。但事实证明,这并不是那么优雅和有用。例如:

def this_is_a_test(arg1, fn_one = self.default_fn_one, fn_two = self.default_fn_two)
  #Something here
end
这有两个缺点:

  • 如果我需要注入更多的方法,arity就会变得太大
  • 如果我只想注入
    fn_-two
    ,并为
    fn_-one
    使用默认值,那是不可能的
  • 所以我尝试了这种方法(从rails中获得了这个想法):


    这确实解决了这两个案例,但我想知道这是否是最好的方法?有没有一种方法可以在没有选项散列的情况下执行此操作?

    我认为您需要使用
    方法
    和显式
    过程
    lambda
    构造。在Ruby 2.0中,还可以使用命名参数完全删除opts哈希。(如果您也希望针对Ruby的早期版本,请修改您的opts哈希方法。)


    (未经测试,但方向正确。)

    我认为您需要使用
    方法
    和显式
    proc
    lambda
    构造。在Ruby 2.0中,还可以使用命名参数完全删除opts哈希。(如果您也希望针对Ruby的早期版本,请修改您的opts哈希方法。)


    (未经测试,但方向正确。)

    看起来您想将内容捆绑到对象中?如果只有一个函数作为参数,您可以使用块参数,但由于需要多个参数,这是没有帮助的。看起来您想将内容捆绑到对象中?如果只有一个函数作为参数,您可以使用一个块参数,但由于需要多个参数,这是没有帮助的。此外,您可以在this|u is_a_a_测试方法定义中使用*args并执行
    args。每个{arg |放置arg.call}
    我还没有使用2.0,但这不会再次出现与我提到的相同的问题吗?如果args被命名(Ruby 2.0)或者在散列中传递,算术问题消失了。此外,您可以在this|is|u a|u测试方法定义中使用*args并执行
    args。每个{arg |放置arg.call}
    我还没有使用2.0,但这不会再次出现与我提到的相同的问题吗?如果args被命名(Ruby 2.0)或以散列形式传递,算术问题消失了。
    def this_is_a_test(arg1, options = {})
      opts = {
        fn_one: self.default_fn_one,
        fn_two: self.default_fn_two
      }.merge(options)
    
    #Something here
    
    end
    
    def this_is_a_test(arg1,
                       fn_one: method(:default_fn_one),
                       fn_two: method(:default_fn_two))
      puts fn_one.call
      puts fn_two.call
      yield if block_given? # allow to pass an optional block too
    end
    
    this_is_a_test(:foo, fn_one: lambda { :bar } do
      puts :baz
    end