1

通常,相同的方法 X 会从不同的对象 A、B、C 中调用。是否可以从方法 X 内部获取调用者对象(A、B、C)的名称

例如:

class Sample
  def method
    # what needs to be done here?
  end
end

n1 = Sample.new
n2 = Sample.new

n1.method #=> expected output is to print n1
n2.method #=> expected output is to print n2
4

4 回答 4

5

不,这行不通。成像以下:

n1 = Sample.new
n2 = n1

n2.method #=> ambiguous, both n1 and n2 would be valid

您可以改为为您的实例分配一个名称:

class Sample
  attr_accessor :name
end

n1 = Sample.new
n1.name = :n1

n2 = Sample.new
n2.name = :n2


n1.name #=> :n1
n2.name #=> :n2
于 2013-09-06T07:04:05.120 回答
4

正如其他人所说,object_id直接使用可能是更好的方法。

无论如何,沿着这条线的东西可能适用于您的情况:

class Sample
  def method(&b)
    eval("local_variables.select {|v| eval(v.to_s).object_id == #{object_id}}", 
         b.binding)
  end
end

n1 = Sample.new
n2 = Sample.new
n3 = n2

p n1.method {}         #=> [:n1]
p n2.method {}         #=> [:n2, :n3]
p Sample.new.method {} #=> []

它返回当前范围内引用被调用对象的所有(局部)变量。如果您的每个对象都被一个变量引用,那么这可能就是您要查找的内容。

Neil Slater 建议:您还可以使用 gem binding_of_caller 来简化绑定转移:

require 'binding_of_caller'

class Sample
  def method
    binding.of_caller(1).eval(
      "local_variables.select {|v| eval(v.to_s).object_id == #{object_id}}"
    )
  end
end

n1 = Sample.new
n2 = Sample.new
n3 = n2

p n1.method         #=> [:n1]
p n2.method         #=> [:n2, :n3]
p Sample.new.method #=> []

(使用 gem 的 0.7.2 版测试)。

于 2013-09-06T12:17:40.810 回答
3

任何对象都可以通过它的 object_id 来识别:

class Sample
  def method
    puts self.object_id
  end
end

n1 = Sample.new
n2 = Sample.new

puts n1.object_id
n1.method

puts n2.object_id
n2.method

--output:--
2152302060
2152302060
2152302040
2152302040

变量名......不是那么多。

于 2013-09-06T07:58:06.157 回答
0

刚回来self应该工作,

这是一个例子:

class Sample
  attr_accessor :name
  def method
    puts self  
    puts self.name  
  end
end

n1 = Sample.new
n1.name = "Bangalore"
n2 = Sample.new
n2.name = "Chennai"


n1.method #=> expected output is to print n1
n2.method #=> expected output is to print n2


-------
Output: 
#<Sample:0x7f492f62c030> # n1 object
Bangalore # n1.name 
#<Sample:0x7f492f62bec8> # n2 object
Chennai #n2.name
于 2013-09-06T11:55:11.577 回答