【发布时间】: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 r或self =~ r可能更清楚。最后,integer?将是更适合该方法的名称。
标签: ruby string class overriding