class 和对象中的 `singleton_class` 方法是什么?
What is `singleton_class` method in class and object?
我在元 class 中定义了方法 specific_data1
和 specific_data2
,并期望这些方法属于单例 class:
class User
def User.specific_data1
"user specific data defined on user"
end
class << self
def specific_data2
"user specific data defined in meta class"
end
end
end
但这两种方法均未在以下位置找到:
User.singleton_class.methods
请帮助我了解 User
class 上的 singleton_method
是什么以及它有什么用。
Object#methods
returns 该对象的方法。 class 中定义的方法不是 class 对象的方法,它们是 class 实例的方法。
这与单例无关classes,对所有classes都是如此:
class Foo
def bar; end
end
Foo.methods.include?(:bar)
# => false
Foo.new.methods.include?(:bar)
# => true
Foo.instance_methods
# => [:bar]
以下是您的示例的工作原理:
User.methods.grep(/specific/)
# => [:specific_data1, :specific_data2]
User.singleton_methods
# => [:specific_data1, :specific_data2]
User.singleton_class.instance_methods.grep(/specific/)
# => [:specific_data1, :specific_data2]
您定义的两个方法都定义为 singleton_class 上的实例方法。
User.singleton_class.instance_methods(false)
# => [:specific_data1, :specific_data2]
Jorg 答对了您问题的技术部分。你想检查
User.singleton_class.instance_methods
这个
Please help me understand what singleton_method
on User
class is and how it is useful."
假设您有一个对象 x
并且您想要为它定义一个方法。一种方法是在 x
的 class 中定义方法,但这会产生为 所有其他对象 定义方法的副作用 class!如果您只想为 单个 对象 x
定义方法怎么办?
Ruby 通过让您创建一个只有 单个 实例的 class 来解决这个问题:x
。这是单例class。其中定义的方法只会影响 x
,因为单例 class 是 x.class
的子 class,并且它的唯一实例是 x
。单例方法只是在单例中定义的常规方法 class.
我在元 class 中定义了方法 specific_data1
和 specific_data2
,并期望这些方法属于单例 class:
class User
def User.specific_data1
"user specific data defined on user"
end
class << self
def specific_data2
"user specific data defined in meta class"
end
end
end
但这两种方法均未在以下位置找到:
User.singleton_class.methods
请帮助我了解 User
class 上的 singleton_method
是什么以及它有什么用。
Object#methods
returns 该对象的方法。 class 中定义的方法不是 class 对象的方法,它们是 class 实例的方法。
这与单例无关classes,对所有classes都是如此:
class Foo
def bar; end
end
Foo.methods.include?(:bar)
# => false
Foo.new.methods.include?(:bar)
# => true
Foo.instance_methods
# => [:bar]
以下是您的示例的工作原理:
User.methods.grep(/specific/)
# => [:specific_data1, :specific_data2]
User.singleton_methods
# => [:specific_data1, :specific_data2]
User.singleton_class.instance_methods.grep(/specific/)
# => [:specific_data1, :specific_data2]
您定义的两个方法都定义为 singleton_class 上的实例方法。
User.singleton_class.instance_methods(false)
# => [:specific_data1, :specific_data2]
Jorg 答对了您问题的技术部分。你想检查
User.singleton_class.instance_methods
这个
Please help me understand what
singleton_method
onUser
class is and how it is useful."
假设您有一个对象 x
并且您想要为它定义一个方法。一种方法是在 x
的 class 中定义方法,但这会产生为 所有其他对象 定义方法的副作用 class!如果您只想为 单个 对象 x
定义方法怎么办?
Ruby 通过让您创建一个只有 单个 实例的 class 来解决这个问题:x
。这是单例class。其中定义的方法只会影响 x
,因为单例 class 是 x.class
的子 class,并且它的唯一实例是 x
。单例方法只是在单例中定义的常规方法 class.