向已定义的类添加方法

时间:2017-10-19 09:10:55

标签: ruby oop

为什么我可以向String类添加新方法?

class String   
  def abc
    "hey"   
  end 
end

puts "jayanti".abc  #hey
puts "meow".abc     #hey

你们能告诉我这是什么OOP概念吗?至于我如何将其与通常教授的OOPS概念联系起来。 再次感谢

3 个答案:

答案 0 :(得分:1)

新答案:

所以你要问这是怎么回事。

在红宝石中,一切都是对象(或几乎)。例如:

String.class # Class

String的课程为Class,因此StringClass的实例。

当您来自C++Java时,乍一看ruby模型对象并不容易理解。

当你这样做时:

class String
  def abc
    "hey"
  end
end
puts "foo".abc #hey

您重新开启课程String并定义新的实例方法abc。您还可以使用关键字Stringself类添加新方法,如下所示:

class String
  def self.abc
    "hey from class :)"
  end
end
puts String.abc #hey from class :)

在这里,您要向abc对象本身添加String方法。

如果您有兴趣了解ruby如何深入学习,那么有很多书,我最喜欢的一本是:https://www.amazon.co.uk/Metaprogramming-Ruby-Program-Like-Facets/dp/1941222129

正如Tiago所说,类重新打开方法称为Monkey修补,你必须谨慎使用它:)

上一个回答:

您可以使用self关键字,如下所示:

class String
  def self.abc
    "hey from class :)"
  end
end

puts String.abc #hey from class :)

答案 1 :(得分:1)

在Ruby中,可以在运行时修改模块和类。来自documentation

  

可以多次重新打开模块以添加,更改或删除功能。

但是你应该只修改你自己的模块/类:

  

重新打开类是Ruby的一个非常强大的功能,但最好只重新打开您拥有的类。重新打开您不拥有的类可能会导致命名冲突或难以诊断错误。

特别是,你不应该改变Ruby的核心类。

答案 2 :(得分:0)

该技术称为Monkey Patching:

https://en.wikipedia.org/wiki/Monkey_patch

爱或恨它,它特别适用于测试,想想Mocks / Stubs。