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

时间:2014-02-10 15:26:10

标签: ruby-on-rails ruby yield

我一直在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”。

3 个答案:

答案 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

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

  1. 不需要&block参数。你也可以使用yield。但是有几个原因可以将它添加到方法定义中:

    • 明确表示您的方法接受块
    • &基本上将块转换为proc对象。这可能很方便,因为您可以将它作为参数传递给另一个接受块的方法。您只需重新应用&即可将其再次设置为阻止。
    • 处理proc对象可能更强大,因为您也可以设置其绑定。
  2. 您可以将参数传递给yield。您传递的参数是块局部变量。例如:

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

    每次迭代时都会使用其中一个数组元素调用

    yield。使用参数调用yieldblock.call(a)相同,其中a是参数。

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

  4. &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