在ruby中如何在ruby中编写'do'方法?

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".

Nik*_*kos 8

创建接受块的方法是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)

关于上述内容,您应该了解一些事项:

  1. &block参数不是必需的.你yield无论如何都可以使用.但是有几个原因可以将它添加到方法定义中:

    • 它清楚地表明您的方法接受一个块
    • 所述&基本上变换块到一个proc对象.这可能很方便,因为您可以将它作为参数传递给另一个接受块的方法.你只需要重新应用&它再做一个块.
    • 处理proc对象可能更强大,因为您也可以设置其绑定.
  2. 你可以传递参数yield.您传递的参数是块局部变量.例如:

    [1,2,3] .each {| x | 把x}

    yield在每次迭代时都使用其中一个数组元素调用.yield使用参数调用与参数block.call(a)where 相同a.

  3. 如果你的方法遇到a yield并且没有给出块,它将引发异常.在某些情况下,这可能是正确的.但是如果你想在没有给出块的情况下有不同的行为,你可以使用该block_given?方法进行检查.

  4. &block 必须是方法定义中的最后一个参数.


big*_*ato 5

传递一个块作为参数

    def my_method(&block)
        do_something_the_same
        yield # calls whatever is inbetween "do" and "end"
    end
Run Code Online (Sandbox Code Playgroud)

  • 如果使用`yield`关键字,则不需要显式指定`&block`参数. (3认同)