为什么我可以向String
类添加新方法?
class String
def abc
"hey"
end
end
puts "jayanti".abc #hey
puts "meow".abc #hey
你们能告诉我这是什么OOP概念吗?至于我如何将其与通常教授的OOPS概念联系起来。 再次感谢
答案 0 :(得分:1)
新答案:
所以你要问这是怎么回事。
在红宝石中,一切都是对象(或几乎)。例如:
String.class # Class
String
的课程为Class
,因此String
是Class
的实例。
当您来自C++
或Java
时,乍一看ruby模型对象并不容易理解。
当你这样做时:
class String
def abc
"hey"
end
end
puts "foo".abc #hey
您重新开启课程String
并定义新的实例方法abc
。您还可以使用关键字String
向self
类添加新方法,如下所示:
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)