ruby - 何时使用回调 vs 仅返回一个值

标签 ruby callback

我在某处查看一些 Ruby 代码,我看到了以下行:

def do_something a, b, c, &callback
  xyz = a + b + c
  callback.call(xyz)
end

然后当它被调用时,他们做了这样的事情:

do_something a, b, c do |xyz|
  puts xyz
end

与仅返回函数产生的值相比,使用这种回调是否更好?如果有多个值需要传输,我能理解为什么会这样做,但是这个只有一个返回。

最佳答案

分析

您的原始帖子中没有足够的信息来确定这是否有用。您的第一个示例的意图似乎是该方法将传递一个 block ,然后在方法内部将其作为 Proc 调用,而不是返回到 block 。这可能有一个有效的用例,但您给出的示例不是其中之一。

如果障碍物已经存在,为什么不屈服于该障碍物?如果没有给出 block 会发生什么?

传递 Proc 或 lambda 对象在某些情况下当然是一种有用的技术,但除非它可以简化您的代码或使其更具可读性,否则您会增加额外的复杂性。您原始帖子中的示例并不能说明为什么可能需要它。即使您用更好的示例更新您的帖子,“是否需要 Proc 对象?”几乎可以肯定是一个基于更大程序需求的主观问题。

除非您需要 Proc 或 lambda 的特性(例如,您需要闭包或访问特定的 Binding ),否则您通常最好还是屈服于一个 block 或返回一个值。您的里程肯定会有所不同。

yield 还是返回

在一般情况下,您可以选择屈服于一个 block 或返回一个值,具体取决于是否给出了一个 block 。例如:

def do_something(a, b, c)
  xyz = a + b + c
  block_given? ? yield(xyz) : xyz
end

除非您需要传递闭包,否则这可能是一种更有用的技术。但是,如前所述,您的里程(和代码库)可能会有所不同。

关于ruby - 何时使用回调 vs 仅返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32030023/

相关文章:

ruby - 我可以在单独的行中对对象和方法调用进行注释吗?

ruby - 是否有可能在 Ruby 中每个 block 一行?

php - empty() 不是有效的回调?

ios - 是否可以将现有方法传递给定义类似于 UIView.animateWithDuration 的回调?

objective-c - 指针在 FSEventStream 回调中丢失(ObjC 和 ARC)

ruby-on-rails - form_tag 中的验证

ruby - 方法调用的符号

ruby - Rails 应用程序的出生日期正则表达式 yyyy-mm-dd

java - 将数据分块同步到服务器会导致 StackoverflowException

javascript - .css 函数的回调