クラスのメソッドでクラスにアプローチした変数の名前を取得したい。そのように:
class Object
def my_val
"#{???} = '#{self.to_s}'"
end
end
a1 = "val1"
a1.my_val # = a1 = 'val1'
a2 = "val2"
a2.my_val # = a2 = 'val2'
私はそれを行うことができますか?
クラスのメソッドでクラスにアプローチした変数の名前を取得したい。そのように:
class Object
def my_val
"#{???} = '#{self.to_s}'"
end
end
a1 = "val1"
a1.my_val # = a1 = 'val1'
a2 = "val2"
a2.my_val # = a2 = 'val2'
私はそれを行うことができますか?
オブジェクトは、どの変数に格納されているか、または格納されていないかを認識していません。多くの場合、これはまったく意味のない概念です。
ここで何が起こると思いますか?
ref = Object.new
another_ref = ref
@ref = another_ref
hash = { key: @ref }
array = [ hash[:key] ]
array[0].my_val
# => ...?
オブジェクトを参照する方法はたくさんあります。どの名前が使用されているかを知ることは重要ではありません。
一般的に言えば、変数は、問題のオブジェクトにとって重要ではない任意の名前が付けられた単なる参照です。
あなたができることは、コンテキストを提供することです:
my_var = "test"
my_var.my_val(:my_var)
# => my_var="test"
次のように実装されます。
def my_var(name)
"#{name}=#{self.inspect}"
end
これを少しロールアップして、賢くすることもできます。
def dump_var(name)
"%s=%s" % [ name, instance_variable_get(:"@#{name}").inspect ]
end
それで:
@foo = "test"
dump_var(:foo)
# => foo="test"
短い答えは「いいえ、できません:/」だと思います。
Ruby (およびほとんどの言語) では、変数名に意味はありません。変数名に関するヒントを提供できるのはコンパイラだけであり、Ruby 内とはまったく別の抽象化レベルにあります。