使用本身包含多个块的块重构方法

发布于 2024-10-13 15:17:22 字数 875 浏览 0 评论 0原文

我正在使用 Ruby 1.9.2

我有一个名为 search 的类方法,它需要一个块,

例如

class MyClass
  def self.search do
    if criteria1
      keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end

    if criteria2
      keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

我想做的是重构 MyClass.search 方法,并为每个 if/end 语句提供一个简单的一行方法,

例如它看起来像这样:

class MyClass

  def self.search do
    c1_method
    c2_method
  end

  def self.c1_method
    if criteria1
      return keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end
  end

  def self.c2_method
    if criteria2
      return keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

但是我上面展示的重构不太有效。看起来我在 c1_method 和 c2_method 中返回的“块”并没有真正在搜索方法中返回和评估,但我不知道该怎么做。

I'm using Ruby 1.9.2

I have a class method called search that takes a block

e.g.

class MyClass
  def self.search do
    if criteria1
      keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end

    if criteria2
      keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

What I'd like to do is refactor the MyClass.search method and have a simple one-line method for each if/end statement

e.g. it would look something like this:

class MyClass

  def self.search do
    c1_method
    c2_method
  end

  def self.c1_method
    if criteria1
      return keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end
  end

  def self.c2_method
    if criteria2
      return keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

But the refactoring that I show above doesn't quite work. It looks like the "blocks" that I'm returning in c1_method and c2_method aren't really being returned and evaluated in the search method, but I'm not sure how to do that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绮烟 2024-10-20 15:17:22

那么,您可以使用 method(sym) 调用来获取方法的主体。

>> def foo(bar); bar * 2; end
=> nil
>> def baz(bleep); method(:foo).call(bleep); end
=> nil
>> baz(6)
=> 12

Well, you can use the method(sym) call in order to get at the body of a method.

>> def foo(bar); bar * 2; end
=> nil
>> def baz(bleep); method(:foo).call(bleep); end
=> nil
>> baz(6)
=> 12
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文