我正在学习Ruby,我想知道: 如何创建.downcase!风格方法? 我显然可以使一个方法可以像downcase一样调用(“CAPS LOCK”) 但我想要string.downcase。 显然这是一个例子,我知道存在downcase方法。 你是怎样做的 ? 谢谢!
答案 0 :(得分:3)
您可以轻松扩展核心类:
class String
def make_it_downcase!
replace downcase # Calls downcase on the current value and replaces it with the result.
end
end
看到它的实际效果:
$ irb
irb(main):001:0> class String
irb(main):002:1> def make_it_downcase!
irb(main):003:2> replace downcase
irb(main):004:2> end
irb(main):005:1> end
=> :make_it_downcase!
irb(main):006:0> test = "TEST"
=> "TEST"
irb(main):007:0> test.make_it_downcase!
=> "test"
irb(main):008:0> test
=> "test"
答案 1 :(得分:3)
定义方法时,它在对象的上下文中可用并调用。这意味着每个方法调用都有一个隐式范围。 downcase
实际上意味着self.downcase
。
例如,如果您直接定义方法,则会将其作为私有方法添加到脚本的main
上下文中。
self
# => main
def downcase
end
# private_methods means self.private_methods
private_methods.include?(:downcase)
# => true
如果希望对象实例在其上下文中调用方法,请在类上定义方法。
class String
def my_downcase
end
end
"string".methods.include?(:my_downcase)
# => true
"string".my_downcase
向内置类型添加方法称为 monkey-patching ,这有点令人不悦。最好将对象子类化以添加功能。 String构造函数接受一个非常适合子类化的字符串, String#replace 用于就地修改字符串。
class CoolString < String
def initialize(str)
super(str)
end
def downcase!
replace(downcase)
end
end
str = CoolString.new("STRING")
str.downcase!
str
# => "string"
答案 2 :(得分:0)
您可以像这样扩展字符串类:
class String
def downcase
#implementation
end
end