如何在ruby中获取调用方对象名?

如何在ruby中获取调用方对象名?,ruby,object,Ruby,Object,通常,从不同的对象A、B、C调用相同的方法X。是否可以从方法X内部获取调用方对象(A、B、C)的名称 例如: 不,这不行。对以下各项进行成像: 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 = Samp

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

例如:


不,这不行。对以下各项进行成像:

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

不,这不行。对以下各项进行成像:

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

任何对象都可以通过其对象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

变量名…不多。

任何对象都可以通过其对象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

变量名…不太多。

只返回
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
类示例
属性存取器:名称
def方法
把自己
把自己的名字
结束
结束
n1=样本。新
n1.name=“班加罗尔”
n2=样本。新
n2.name=“钦奈”
n1.方法#=>预期输出为打印n1
n2.method#=>预期输出为打印n2
-------
输出:
##n1对象
班加罗尔#n1.姓名
##n2对象
钦奈#n2.姓名

只要返回
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
类示例
属性存取器:名称
def方法
把自己
把自己的名字
结束
结束
n1=样本。新
n1.name=“班加罗尔”
n2=样本。新
n2.name=“钦奈”
n1.方法#=>预期输出为打印n1
n2.method#=>预期输出为打印n2
-------
输出:
##n1对象
班加罗尔#n1.姓名
##n2对象
钦奈#n2.姓名

正如其他人所说,直接使用
对象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_调用者来简化 转移绑定:

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版进行测试)。

正如其他人所说,直接使用
对象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_调用者来简化 转移绑定:

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版进行测试)。

可能的dup@YevgeniyAnfilofyev它不是您指定的链接的副本。OP请求打印调用对象名称的方法,而您提供的链接描述了打印调用对象名称的方法method@user2753200实际上,您要求的是变量名,调用者指的是执行堆栈。而且,它不是对象名,因为对象没有名称,只是一个ID。@undur_gongor只是一个用户认为它不符合主题可能是dup@YevgeniyAnfilofyev它不是您指定的链接的副本。OP请求打印调用对象名称的方法,而您提供的链接描述了打印调用对象名称的方法method@user2753200实际上,您要求的是变量名,调用者指的是执行堆栈。而且,它不是对象名,因为对象没有名称,只有一个ID。@undur\u gongo或者只有一个用户从技术上考虑了它。
n2。方法
在语法上并不含糊。相反,Ruby的内部结构使查找使用了哪一个指针变得不可解析(而且在任何情况下都不可取)。@NeilSlater这在任何语言中都是可能的吗?我不想说“从不”,但我想不出一种可以通过编程方式查找变量名的语言。可能有一些可以通过调用方堆栈和代码内省进行黑客攻击,这在大多数情况下都是可行的。尽管如此,即使在可能的语言中,这也会滥用变量名,OP可能有其他方法来实现未说明的更高级别目标。从技术上讲,
n2。方法
在语法上并不含糊不清。相反,Ruby的内部结构使查找使用了哪一个指针变得不可解析(而且在任何情况下都不可取)。@NeilSlater这在任何语言中都是可能的吗?我不想说“从不”,但我想不出一种可以通过编程方式查找变量名的语言。可能有一些可以通过调用方堆栈和代码内省进行黑客攻击,这在大多数情况下都是可行的。尽管如此,即使在可能的语言中,这也会滥用变量名,OP可能有其他方法来实现未说明的更高级别目标。我认为OP混淆了变量名和对象标识,并且不清楚真正需要的是什么。前者是不可取的(除了堆栈中的跟踪),后者是根据您的回答,相对简单。我认为OP混淆了变量名和对象标识,并不是100%清楚真正需要的。前者是不可取的(除了可能在堆栈跟踪中),后者是根据您的回答,相对简单。尝试将此与调用方的
binding\u
gem:-)尝试将此与调用方的
binding\u
gem:-)结合