【问题标题】:Add method in same class or in String class - Best practices在同一类或字符串类中添加方法 - 最佳实践
【发布时间】:2015-08-06 00:03:43
【问题描述】:

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

# 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

它在同一个类和派生类中像这样调用:

# lib/rips/variables/inmediate.rb

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

但另一种方法是将方法 number? 添加到 String 类:

# 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

所以我有number?(value),如果我在同一个类中声明方法,或者value.number?,如果我将方法添加到String类。不仅仅是方法,我也想添加更多新方法。我更喜欢第二种方式,但我不知道在这种情况下是否是最佳做法。

最佳做法是什么?

【问题讨论】:

  • 没有必要将连字符放在字符类中。另外,如果你的正则表达式是r,那么写match rself =~ r 可能更清楚。最后,integer? 将是更适合该方法的名称。

标签: ruby string class overriding


【解决方案1】:

最好的方法是使用Refinements(通过链接描述了为什么以及如何使用它的功能)。它从 ruby​​ 2.0 开始可用。

【讨论】:

  • 我喜欢,我不知道Refinements,但我需要兼容1.9.3。
【解决方案2】:

还有第三种选择,您可以方便地直接在 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

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多