仅特定于实例的方法?它们在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]