Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向标准ruby对象添加自定义方法_Ruby - Fatal编程技术网

向标准ruby对象添加自定义方法

向标准ruby对象添加自定义方法,ruby,Ruby,如何向标准ruby对象(如字符串和整数)添加自定义方法 例如,我在rails和ruby的mojinizer库中看到了这一点,它可以将罗马文字字符串转换为平假名,如 "tsukue".hiragana #=> "つくえ" 只需打开类并添加方法。您可以根据需要多次打开一个类 class Fixnum def lucky? self == 7 end end 95.lucky? => false 7.lucky? => true 这是一种有用的能力,我们都做到

如何向标准ruby对象(如字符串和整数)添加自定义方法

例如,我在rails和ruby的mojinizer库中看到了这一点,它可以将罗马文字字符串转换为平假名,如

"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我认为 >细化> /Cord>是绝对的邪恶,永远不要使用它们,因为在这里吠叫的猫和损坏的猫比到处都是猫的合同要糟糕得多。与优化相关的问题难以诊断、定位和调试。如果我不需要猫在某处吠叫,我最好实现代理和委托。你也可以把<代码>预置< /代码>包装成一个隔离的细化。@ J.O.RGWMITAG我认为<代码>细化> /代码>绝对邪恶,永远不要使用它们。因为在这里吠叫的猫在那里咕咕叫,比到处喵喵叫的猫有更糟糕的契约。与优化相关的问题难以诊断、定位和调试。无论我是否不需要猫在某处吠叫,我最好实现一个代理和委托。