2011-03-15 76 views
1

在我的应用程序,我有一些代码,看起来像这样:红宝石方法,需要一个块,并调用该块

if is_translation? 
    @booking.enable_dirty_associations do           
    booking_update 
    end 
else 
    booking_update 
end 

我想它,而不是看起来像这样:

is_translation? ? @booking.enable_dirty_associations : func do 
    booking_update 
end 

其中func是采取该块并刚刚执行它的方法。

有没有一个内置的Ruby方法,或者可能是一个combinator函数来做到这一点?

+1

是被传入的块吗?你以某种方式创造它?根据你提供的东西你不需要一个块,你可以这样做:“is_translation??booking.enable_dirty_associations:booking_update”并且“booking_update”是你正在工作的实例的方法。需要更多的信息真的有帮助。 – Brandon 2011-03-15 09:29:22

+0

booking_update是我正在处理的实例的一种方法。 enable_dirty_associations我认为只需要一个块,我想在该块中执行的操作是调用booking_update。 – paulodeon 2011-03-15 10:02:48

+0

作为一个例子,原型js库提供Prototype.K http://api.prototypejs.org/Prototype/K/函数,它返回它的参数不变。我想我正在寻找的东西是沿着这些线。 – paulodeon 2011-03-15 13:15:42

回答

1

这将是很容易写FUNC()自己:

def func 
    yield 
end 

然而不幸的是,你的想法是行不通的,块将只适用于func,而不是第一个电话。我能想到的去接近你想要的东西的唯一方法是定义块作为proc和手动传递:

block = Proc.new { booking_update } 

is_translation? ? @booking.enable_dirty_associations(&block) : block.call 

,这是否有不需要的func()方法的优势。

+0

我认为语法可能稍微偏离那里。我希望我可以做一些像'(is_translation?[email protected]_dirty_associations:func)做booking_update结束' 我知道Proc.new方法,但正在寻找更优雅的东西 – paulodeon 2011-03-15 10:04:28