rubyのinstance_evalについて
Q&A
Closed
マニュアル
オブジェクトのコンテキストで文字列 expr またはオブジェクト自身をブロックパラメータとするブロックを評価してその結果を返します。
問題
アクセスするattribute名がname
だと、結果が思ったものにならない。
attribute名がname
だとnilが返ったり、"name"
とそのままだったり
attribute名nameを使った場合
puts RUBY_VERSION
class A
attr_accessor :name
end
a = A.new
a.name = "Hello World!"
p "a.name ↓", a.name
puts
p %|a.instance_eval("name") ↓|, a.instance_eval("name")
puts
p %|a.instance_eval("self.name") ↓|, a.instance_eval("self.name")
puts
attr_name = "name"
name = "name"
p "a.instance_eval(attr_name) ↓", a.instance_eval(attr_name)
puts
p "a.instance_eval(name) ↓", a.instance_eval(name)
puts
結果
/app # ruby name.rb
3.3.0
"a.name ↓"
"Hello World!"
"a.instance_eval(\"name\") ↓"
nil
"a.instance_eval(\"self.name\") ↓"
"Hello World!"
"a.instance_eval(attr_name) ↓"
"name"
"a.instance_eval(name) ↓"
"name"
attribute名がnameでなければ、思ったとおりに返ってくる
attribute名name**以外**を使った場合
puts RUBY_VERSION
class A
attr_accessor :gagaga
end
a = A.new
a.gagaga = "Hello World!"
p "a.gagaga ↓", a.gagaga
puts
p %|a.instance_eval("gagaga") ↓|, a.instance_eval("gagaga")
puts
p %|a.instance_eval("self.gagaga") ↓|, a.instance_eval("self.gagaga")
puts
attr_name = "gagaga"
name = "gagaga"
p "a.instance_eval(attr_name) ↓", a.instance_eval(attr_name)
puts
p "a.instance_eval(name) ↓", a.instance_eval(name)
puts
結果
/app # ruby gagaga.rb
3.3.0
"a.gagaga ↓"
"Hello World!"
"a.instance_eval(\"gagaga\") ↓"
"Hello World!"
"a.instance_eval(\"self.gagaga\") ↓"
"Hello World!"
"a.instance_eval(attr_name) ↓"
"Hello World!"
"a.instance_eval(name) ↓"
"Hello World!"
nameが言語的にクラスの定義済メソッドとかでは無さそうだし、多分とても簡単な理由なんだと思いますが、分かる人居ますか?
1