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

When to use callbacks vs just returning a value

我在某处查看一些 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

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

分析

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

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

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

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

产量或Return

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

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

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

我会称之为不良做法,因为此方法需要 一个块(你会得到一个 NoMethodError 没有一个)。拥有一种立即将 return 值传递给块的机制可能很有用,但我不会强制要求它。

一个简单的改进是使块可选

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