在相同 class 或字符串 class 中添加方法 - 最佳实践

Add method in same class or in String class - Best practices

我想定义一个新方法来验证这样的字符串:

# lib/rips/variables/variable.rb

class Variable
  # Check if value is a valid number (...,-1,0,1...)
  def number? (value)
    /\A[-]?\d+\z/ === value
  end
end

并且它在相同的 class 和派生的 class 中这样调用:

# lib/rips/variables/inmediate.rb

class Inmediate < Variable
  # value = "+42" -> return false
  def valid_syntax? (value)
    number?(value)
  end
end

但另一种方法是将方法 number? 添加到字符串 class:

# lib/rips/utils/string.rb

class String
  # Check if value is a valid number (...,-1,0,1...)
  def number?
    /\A[-]?\d+\z/ === self
  end
end

现在它像这样调用:

# lib/rips/variables/inmediate.rb
require "lib/rips/utils/string"

class Inmediate < Variable
  # value = "+42" -> return false
  def valid_syntax? (value)
    value.number?
  end
end

因此,如果我在相同的 class 中声明方法,则我有 number?(value);如果我将方法添加到字符串 class,则我有 value.number?。不仅是方法,我还想添加更多新方法。我更喜欢第二种方式,但我不知道在这种情况下是否是最佳实践。

最佳做法是什么?

最好的方法是使用 Refinements(由 link 描述了为什么以及如何使用它的功能)。自 ruby 2.0.

起可用

还有第三个选项,您可以方便地直接在 String object, 上调用您的自定义方法,而无需将其添加到 String class

module StringExtensions
  def number?
    /\A[-]?\d+\z/ === self
  end
end

string = "1"

string.number? # => NoMethodError: undefined method `number?' for "1":String

string.extend(StringExtensions)
string.number? # => true

"2".number? # => NoMethodError: undefined method `number?' for "1":String