通过搜索一些博客和文章,我发现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
现在已经完全混淆了所以请告诉我这个
答案 0 :(得分:4)
在第一句中,您创建了具有超级类String
的匿名类:
my_str.class.superclass # => String
但这不是你实际问题的本质:)
实例是某个类的对象:String.new() # creates instance of class String
。实例具有类(String.new()).class #=> String
。所有类实际上都是类Class
的实例:String.class # => Class
。 Class
类的实例也有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对象模型,Dog
是constant
,指向类Class
的实例。每当将一个类方法添加到Dog时,将在类层次结构中添加一个名为Metaclass
的新类,以保留类方法。