ruby 功能: best practice?

标签 ruby functional-programming

假设我想使用自定义方法选择数组中的元素。为了论证的目的,我将使用奇偶校验。

现在一般来说,有什么好的做法/建议可以选择使用

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/

相关文章:

Haskell——理解编写器类型声明

language-agnostic - 定界和非定界延续之间的区别

ruby - 是否有适用于 Ruby 的合理 BBCode 库?

ruby - 在ruby中读取文件时是否可以指定换行符类型

ruby-on-rails - 如何解决sqlplus冲突?

recursion - 在 Ocaml 中使用 "and"进行多个相互递归函数

haskell - 如何捕获并忽略 Haskell 中的错误调用

ruby-on-rails - 如何更改 ruby​​ on rails 中的数据库模型?

ruby-on-rails - 当我尝试执行 bundle install Nokogiri 时出现 Bundler 错误

haskell - 如果 applicative 就足够了,为什么序列需要 monad?