如何在 Ruby 中动态地将代码包装在块内?

发布于 2025-01-04 08:31:41 字数 215 浏览 1 评论 0原文

假设代码的某一部分需要在不同的块/上下文中运行,具体取决于配置选项。例如,

if silence
  silence_stdout do
    # do something
  end
else
  # do the same thing
end

有没有一种方法可以在不重复 # do some 代码的情况下编写此代码?

Suppose a certain part of code needs to be run inside a different block/context, depending on a configuration option. For example,

if silence
  silence_stdout do
    # do something
  end
else
  # do the same thing
end

Is there a way to write this without repeating the # do something code?

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

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

发布评论

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

评论(1

予囚 2025-01-11 08:31:42

根据“做某事”的代码量,您可以将其放入 lambda 中:

something = -> { do_something }
if silence
  silence_stdout &something
else
  something.call
end

或将其放入方法中:

def something
  # Do something, lots and lots of something.
end

if silence
    silence_stdout &method(:something)
else
    something
end

您还可以稍微翻转一下逻辑:

def no_op
  yield
end
def silence_stdout
  # Do whatever and then...
  yield
end

m = method(silence ? :no_op : :silence_stdout)
m.call do
  # Do something
end

或者您可以使用整个类或仅使用 lambda 而不是其中的方法最后一张。

Depending on how much code "do something" is you could throw it in a lambda:

something = -> { do_something }
if silence
  silence_stdout &something
else
  something.call
end

or throw it in a method:

def something
  # Do something, lots and lots of something.
end

if silence
    silence_stdout &method(:something)
else
    something
end

You could also turn the logic inside out a bit:

def no_op
  yield
end
def silence_stdout
  # Do whatever and then...
  yield
end

m = method(silence ? :no_op : :silence_stdout)
m.call do
  # Do something
end

Or you could use whole classes or just lambdas instead of methods in that last one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文