何时使用回调 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
我在某处查看一些 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