我有一个接受块的方法,让我们称之为外部。它依次调用接受另一个块的方法,将其称为内部方法。
我希望发生的是外部调用内部,传递给它一个调用第一个块的新块。
这是一个具体的例子:
class Array
def delete_if_index
self.each_with_index { |element, i| ** A function that removes the element from the array if the block passed to delete_if_index is true }
end
end
['a','b','c','d'].delete_if_index { |i| i.even? }
=> ['b','d']
Run Code Online (Sandbox Code Playgroud)
传递给 delete_if_index 的块被传递给 each_with_index 的块调用。
这在 Ruby 中是否可行,更广泛地说,我们对接收它的函数中的块有多少访问权限?
您可以将一个块包装在另一个块中:
def outer(&block)
if some_condition_is_true
wrapper = lambda {
p 'Do something crazy in this wrapper'
block.call # original block
}
inner(&wrapper)
else
inner(&passed_block)
end
end
def inner(&block)
p 'inner called'
yield
end
outer do
p 'inside block'
sleep 1
end
Run Code Online (Sandbox Code Playgroud)
我会说打开一个现有的块并更改其内容是 Doing it Wrong TM,也许 continuation-passing 会在这里有所帮助?我也会警惕传递带有副作用的块;我尝试保持 lambdas 的确定性,并执行诸如删除方法主体中的内容之类的操作。在复杂的应用程序中,这可能会使调试变得容易得多。
| 归档时间: |
|
| 查看次数: |
1442 次 |
| 最近记录: |