如何在ruby中访问类方法和实例方法?

时间:2012-02-09 12:53:45

标签: ruby-on-rails ruby ruby-on-rails-3

通过搜索一些博客和文章,我发现Ruby中的每个类本身都是Class的一个实例。类方法和实例方法之间有什么区别,ruby是否允许创建对象的对象?

我尝试做这样的事情,但仍然无法理解

str = Class.new(String)
=> #<Class:0xb5be1418>

my_str = str.new()
=> ""

my_str = str.new("hello")
=> "hello"

my_str.class
=> #<Class:0xb5be1418>

str.class
=> Class

现在已经完全混淆了所以请告诉我这个

2 个答案:

答案 0 :(得分:4)

在第一句中,您创建了具有超级类String的匿名类:

my_str.class.superclass # => String

但这不是你实际问题的本质:)

实例是某个类的对象:String.new() # creates instance of class String。实例具有类(String.new()).class #=> String。所有类实际上都是类Class的实例:String.class # => ClassClass类的实例也有superclass - 它们继承的类。

实例方法是一种可以在对象实例上调用的方法。

"st ri ng".split # split is an instance method of String class
Ruby中的

类方法Class类(任何类)对象的实例方法的通用术语。

String.try_convert("abc") # try_convert is a class method of String class.

您可以在this article中阅读有关实例和类方法的更多信息。

答案 1 :(得分:0)

class Dog
 # Returns the number of dog objects created using this class
 def self.count
 end

 # Returns name of the dog object
 def name
 end
end

从上面的例子中,泛型方法(与所有狗对象相关)被称为class method

与特定狗(狗对象)相关的方法称为instance method

根据ruby对象模型,Dogconstant,指向类Class的实例。每当将一个类方法添加到Dog时,将在类层次结构中添加一个名为Metaclass的新类,以保留类方法。