假设我想使用自定义方法选择数组中的元素。为了论证的目的,我将使用奇偶校验。
现在一般来说,有什么好的做法/建议可以选择使用
class Integer # Adding method to the Integer class
def my_fancy_select
self % 2 == 0
end
end
puts my_array.select(&:my_fancy_select)
和
def my_fancy_select(i) # could be a private method
i % 2 == 0
end
puts my_array.select{|i| my_select(i)}
,
puts my_array.select{|i|
i % 2 == 0 # Directly passing a block
}
,甚至使用 Procs ?
最佳答案
您应该避免添加到Integer
,除非您认为该方法真正解决了所有整数的行为。即使如此,您也应该小心碰撞。
除此之外,没有固有的理由选择第二种或第三种形式,特别是在您的简单示例中。
代码块和方法提供了不同的代码重用方法。当重复“外部”模式并且您只想改变内部的几行时, block 可以很好地工作。当您需要在多个地方执行完全相同的“内部”逻辑时,方法可以很好地工作。
如果您的过滤逻辑确实在多个地方重复,那么我倾向于将其设为 mixin 上的方法,或合适的自定义类的类方法,并在 block 中调用该方法。这是你的第二个例子。否则,带有 block 的直接单行代码就适合我的目的,我可以就地读取所有内容,这提供了轻微的可读性优势(假设代码保持干燥) - 这是您的第三个示例。
关于 ruby 功能: best practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21261731/