仅特定于实例的方法?它们在Ruby中叫什么?
我知道有“实例方法”、“类方法”,但这些类型的方法叫什么,例如:仅特定于实例的方法?它们在Ruby中叫什么?,ruby,singleton,Ruby,Singleton,我知道有“实例方法”、“类方法”,但这些类型的方法叫什么,例如: s1 = "This is my STRING!" def s1.m1 downcase end p s1 # => "This is my STRING!" p s1.m1 # => "this is my string!" 在“string”类的s1“instance”上调用的“m1”方法是什么类型的方法?这真的很奇怪,因为我根本不知道如果我尝试: s2 = "This is ANOTHER
s1 = "This is my STRING!"
def s1.m1
downcase
end
p s1 # => "This is my STRING!"
p s1.m1 # => "this is my string!"
在“string”类的s1“instance”上调用的“m1”方法是什么类型的方法?这真的很奇怪,因为我根本不知道如果我尝试:
s2 = "This is ANOTHER string"
s2.m1 # => Won't work!
哪种方法有意义,但不确定为什么在类的实例上定义m1这样的方法是有用的。它们被称为对象
单例方法
一个示例
我可以想到在哪里可以使用它:
您有一个特殊的日志类,您必须将日志记录限制为仅一个实例,因为您希望日志文件干净整洁
也许不是最好的例子,但如果您对用例感兴趣,请查找单例模式的用例,您应该在那里找到答案 它们被称为单例方法。以下是一些检查这些的方法:
s1 = "This is my STRING!"
def s1.m1
downcase
end
klass= s1.singleton_class # => #<Class:#<String:0x902d4e8>>
klass.instance_methods(false) # => [:m1]
s1.method(:m1).owner # => #<Class:#<String:0x902d4e8>>
s1.singleton_methods # => [:m1]
s1=“这是我的字符串!”
def s1.m1
唐卡斯
结束
klass=s1.singleton#U类#=>#
klass.instance_方法(false)#=>[:m1]
s1.方法(:m1).所有者#=>#
s1.singleton_方法#=>[:m1]
但不确定为什么在类的实例上定义m1这样的方法是有用的
这些单例方法(m1
)只能由s1
调用,正如您在s1
的单例类中定义的那样。但不能由字符串的任何其他实例执行。当您具有对象特有的某些行为时,无论这些行为是否属于同一类或不同类,都需要这些行为
s2.m1#=>不起作用
因为您没有在s1
的singleton类中定义它,所以它们被称为singleton方法,可以定义如下:
class Person
def favorite_meal
"Big Mac"
end
end
Fred, Joe = 2.times.map { Person.new }
def Fred.favorite_meal
"Le Big Mac"
end
Joe.favorite_meal #=> Big Mac
Fred.favorite_meal #=> Le Big Mac
定义相同单例方法的其他方法有:
Fred.define_singleton_method :favorite_meal do "Le Big Mac" end
以及:
现在,Dog
类知道它的实例,并且实例知道它们的名称
Dog.instances.map { |dog| dog.name } #=> :Spot, :Rover
Dog.instances.names # the simpler way to say the same
这在这个特定的例子中并不有用(在其他地方也非常有用),但在任何情况下,它都让我养成了一种习惯,即给对象取大写的专有名称
对于第一个问题,def Fred.foobar
是最基本、一次性的单例方法定义。如果要定义多个单例方法或别名,或在单例类中包含一个模块,请使用class“(…)但不确定为什么在类的实例上定义m1之类的方法很有用。”
它使这种行为成为可能:
class Test
def self.some_meth
end
end
Test只是类的一个实例,并向这个特定实例添加了一些_方法
p Test.singleton_methods #=> [:some_meth]
+1对于如此详细的解释。。。我总是喜欢细节的……)谢谢你的详细解释。在你概述的三个方面中,人们最常用的定义是什么?我还注意到你用大写字母来表示变量名,也许有一种惯例,就是用大写字母来定义变量名,以防你为它们定义任何单例方法?@daremarkovic:你的兴趣让我很高兴。我将通过编辑帖子来回答。
module Foo
def bar; "Fretbar!" end
end
class << Fred
include Foo
alias le_favorite favorite_meal
end
Fred.bar #=> Fretbar!
Fred.le_favorite #=> "Le Big Mac"
local_var = 42
Fred.singleton_class.class_exec do
define_method :baz do local_var + 1 end
end
Fred.baz #=> 43
local_var = 32
Fred.baz #=> 33
class Test
def self.some_meth
end
end
p Test.singleton_methods #=> [:some_meth]