2013-12-23 67 views
1

我有一个作为参数传递给函数的块。该块包含几种方法。它是这样的:访问Ruby块中的方法

def func(&block) 
end 

func do 
    method1 
    method2(arg) 
    method3(arg) 
end 

我想FUNC返回的功能组成的块:

method3 (method2 (method1)) 

有没有一种方法能够获得每块中的方法,所以我可以使用methods.reduce(method1) { |method| method.call arg }或类似的东西?

你能给我一些想法吗?

回答

3

不,这是不可能的。你可以(理论上)解析与块定义相关的Ruby代码,但我不确定这是否合理。

你的问题是非常通用的,如果你能控制或不控制,你不提供任何细节,而现实世界的例子可能会更有帮助。

从我的具体细节,我的建议是,你应该在原点分割块。不是传递包含所有这些方法的整个块,而是将方法数组作为参数传递,以便您可以随意使用它们。

您可以将它们包装在lambda中,以延迟执行。

def func(*chain) 
end 

func(
    ->(arg) { method1 }, 
    ->(arg) { method2(arg) }, 
    ->(arg) { method3(arg) } 
) 

您还可以使用Object.method获取的方法和它传递的参数。

def func(*chain) 
end 

func(
    method(:method1), 
    method(:method2), 
    method(:method3) 
) 
+0

我喜欢这种风格'方法(:方法1)'... +1 –

+0

谢谢你的想法! :) – Faery

+0

由于我正在考虑解决这个问题,还有一个问题出现了:是否有一种方法可以获得块中每个方法返回的值的数组,因为'result = yield block'将只包含值从最后一个方法返回:( – Faery