我一直在Ruby中编写相同的代码模式,看起来它会受益于'do'样式的代码,但我不确定如何编写该方法。
我一直在做这种代码模式,它以相同的代码行开始和结束......
x.increment!(:step_count) # same each time
# ...then some different code each
x.update_column(:step_description, "blerg message") # same each time
我觉得它会从'做'看起来像这样的东西中受益......
update_steps "blerg message" do
# ...then some different code each
end
然后每次在执行公共代码时执行'do'。
我如何制作一个可以使用'do'的方法。
谢谢!
编辑:我认为不要关闭它是很重要的,因为我不知道要搜索'block'或'yield'。可能不知道这些条款的人最终可能会搜索“do”。
答案 0 :(得分:6)
创建接受块的方法是Ruby最强大的功能之一。
定义这种方法的常用方法是:
def foo(*args, &block)
# your code here
yield
# some more code
end
foo do
# This code runs when yield is called
end
关于上述内容,您应该了解一些事项:
不需要&block
参数。你也可以使用yield
。但是有几个原因可以将它添加到方法定义中:
&
基本上将块转换为proc
对象。这可能很方便,因为您可以将它作为参数传递给另一个接受块的方法。您只需重新应用&
即可将其再次设置为阻止。proc
对象可能更强大,因为您也可以设置其绑定。您可以将参数传递给yield
。您传递的参数是块局部变量。例如:
[1,2,3] .each {| x |把x}
每次迭代时都会使用其中一个数组元素调用 yield
。使用参数调用yield
与block.call(a)
相同,其中a
是参数。
如果您的方法遇到yield
并且没有给出阻止,则会引发异常。在某些情况下,这可能是正确的。但是如果你想在没有给出阻止的情况下有不同的行为,可以使用block_given?
方法进行检查。
&block
必须是方法定义中的最后一个参数。答案 1 :(得分:5)
将一个块作为参数传递
def my_method(&block)
do_something_the_same
yield # calls whatever is inbetween "do" and "end"
end
答案 2 :(得分:1)
或者您也可以通过拨打block.call
def update_steps(&block)
block.call()
end