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