在相同 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
我想定义一个新方法来验证这样的字符串:
# 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