向标准ruby对象添加自定义方法
如何向标准ruby对象(如字符串和整数)添加自定义方法 例如,我在rails和ruby的mojinizer库中看到了这一点,它可以将罗马文字字符串转换为平假名,如向标准ruby对象添加自定义方法,ruby,Ruby,如何向标准ruby对象(如字符串和整数)添加自定义方法 例如,我在rails和ruby的mojinizer库中看到了这一点,它可以将罗马文字字符串转换为平假名,如 "tsukue".hiragana #=> "つくえ" 只需打开类并添加方法。您可以根据需要多次打开一个类 class Fixnum def lucky? self == 7 end end 95.lucky? => false 7.lucky? => true 这是一种有用的能力,我们都做到
"tsukue".hiragana #=> "つくえ"
只需打开类并添加方法。您可以根据需要多次打开一个类
class Fixnum
def lucky?
self == 7
end
end
95.lucky?
=> false
7.lucky?
=> true
这是一种有用的能力,我们都做到了。注意您的代码是可维护的,并且不会破坏基本功能 只需打开类并添加方法。您可以根据需要多次打开一个类
class Fixnum
def lucky?
self == 7
end
end
95.lucky?
=> false
7.lucky?
=> true
class String
def add_exclamation_mark
self + "!"
end
end
> "hello".add_exclamation_mark
"hello!"
这是一种有用的能力,我们都做到了。注意您的代码是可维护的,并且不会破坏基本功能
class String
def add_exclamation_mark
self + "!"
end
end
> "hello".add_exclamation_mark
"hello!"
这样,您就可以向String类添加新方法
通过这种方式,您将向字符串类添加新方法。如果您确实觉得有必要扩展您不拥有的类的默认行为(这基本上是一个非常糟糕的主意,应该使用其他方式来实现此功能),您不应该重新打开类,而应该重新打开具有所需功能的模块:
String.prepend(Module.new do
def uppercase!
self.replace upcase
end
end)
str = "hello"
str.uppercase!
#⇒ "HELLO"
str
#⇒ "HELLO"
如果类中存在要覆盖的方法,则仍然可以通过从模块方法内部调用
super
来访问该方法。如果您确实觉得有必要扩展您不拥有的类的默认行为(这基本上是一个非常糟糕的主意,应该使用其他方法来实现此功能,)您不应重新打开类,而应打开具有请求功能的模块:
String.prepend(Module.new do
def uppercase!
self.replace upcase
end
end)
str = "hello"
str.uppercase!
#⇒ "HELLO"
str
#⇒ "HELLO"
如果类中存在要覆盖的方法,则仍然可以通过从模块方法内部调用
super
来访问该方法。您只需重新打开类(在这种情况下,它将是String
class)并定义所需的方法即可。但这是不可取的,尤其是对Ruby初学者来说。@MarekLipka预先编写模块是一种更好的方法,因为它允许在重写方法时调用super
。您只需重新打开类(在这种情况下,它将是String
class)并定义所需的方法。但这是不可取的,特别是对于Ruby初学者。@MarekLipka在模块前面加上前缀是一种更好的方式,因为它允许在覆盖方法时调用super
。这个答案对@SteveTurczyn之前给出的答案没有任何附加值,而且该方法的名称令人困惑,因为它实际上没有给接收者添加感叹号,它只返回一个附加了感叹号的接收者。这个答案对@SteveTurczyn之前给出的答案没有任何附加值,加上该方法的名称令人困惑,因为它确实没有向接收者添加感叹号,它只返回一个附加了感叹号的接收器。你也可以把<代码>预置< /COD>包装成一个隔离的细化。@ Jo.RGWMITAGET我认为