红宝石注入方法作为参数

时间:2013-12-05 16:29:40

标签: ruby

所以我正在尝试编写功能性ruby,为此需要在需要时注入lambda。但事实证明这并不是那么优雅和有用。例如:

def this_is_a_test(arg1, fn_one = self.default_fn_one, fn_two = self.default_fn_two)
  #Something here
end

这有两个缺点:

  1. 如果我需要注入更多方法,那么arity会变得太大
  2. 如果我只想注入fn_two并使用fn_one默认值
  3. 所以我尝试了这种方法(从rails中获取了这个想法):

    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
    

    这确实处理了这两种情况,但我想知道这是否是最佳方法?有没有办法在没有选项哈希的情况下做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为您希望使用method和明确的proclambda构造。在Ruby 2.0中,您的opts哈希也可以通过使用命名参数完全删除。 (如果你想要定位早期版本的Ruby,修改你的opts哈希方法。)

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

(未经测试,但应该让你朝着正确的方向前进。)