所以我正在尝试编写功能性ruby,为此需要在需要时注入lambda。但事实证明这并不是那么优雅和有用。例如:
def this_is_a_test(arg1, fn_one = self.default_fn_one, fn_two = self.default_fn_two)
#Something here
end
这有两个缺点:
fn_two
并使用fn_one
默认值所以我尝试了这种方法(从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
这确实处理了这两种情况,但我想知道这是否是最佳方法?有没有办法在没有选项哈希的情况下做到这一点?
答案 0 :(得分:1)
我认为您希望使用method
和明确的proc
或lambda
构造。在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
(未经测试,但应该让你朝着正确的方向前进。)