【问题标题】:In ruby how do I write a 'do' method in ruby? [duplicate]在 ruby​​ 中,我如何在 ruby​​ 中编写“do”方法? [复制]
【发布时间】:2014-03-08 00:24:02
【问题描述】:

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

谢谢!

编辑:我认为不要关闭它很重要,因为我不知道要搜索“阻止”或“屈服”。可能不知道这些术语的人最终可能会搜索“do”。

【问题讨论】:

  • 它被称为“块”,yield 关键字是有效成分。这应该会有所帮助:Blocks and Yields in Ruby
  • "因为我不知道要搜索 'block' 还是 'yield'" 关闭不会变成删除。相反,您建议其他人可能会搜索“do”,而这正是关闭它的原因。这样做会将其与具有正确术语的问题联系起来,并且已经有几个完整且高度赞成的答案。在这种情况下,关闭并不是一件坏事,特别是因为您仍然可以获得与您的用例相关的答案,但它会将未来的搜索者引导到其他相关答案。

标签: ruby-on-rails ruby yield


【解决方案1】:

将块作为参数传递给它

    def my_method(&block)
        do_something_the_same
        yield # calls whatever is inbetween "do" and "end"
    end

【讨论】:

  • 如果你使用yield关键字,你不需要明确指定&block参数。
  • 你如何考虑其他字符串参数,所以我想传入一个字符串,然后是块?
  • @Smickie 您可以通过常规方式将参数传递给yield,例如yield(str)
【解决方案2】:

或者你也可以通过调用block.call来做到这一点

def update_steps(&block)
  block.call()
end

【讨论】:

    【解决方案3】:

    创建接受块的方法是 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 必须是方法定义中的最后一个参数。

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 2022-11-18
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多