
No.4ベストアンサー
- 回答日時:
結論から言うと、#1の回答にあるようにevalの前に代入を行うという
手段をとりたくないというのであれば、方法はありません。
なぜなら、eval の引数はその中で閉じた世界になっているので、
そこで初めて出現した変数(質問の例で言えば hoge)は、evalを終えたところで
その寿命が尽きて消えてなくなるので、eval後に参照してもすでに存在していないので
エラーになるというわけです。
irb でエラーにならないのは、irb自体がRubyスクリプトであり
通常の解釈とは微妙に異なる点があるためです。
Ruby認定試験対策問題
http://projects.netlab.jp/ruby-test/index.html
Ruby認定試験対策問題 解答
http://projects.netlab.jp/ruby-test/answers.html
の、1.4.3の解説を参照してください。
何のためにそういうことをしたいのかを説明してもらえれば、代替策を
提示できるかもしれません。
この回答への補足
ご回答ありがとうございます。
>何のためにそういうことをしたいのかを説明してもらえれば、代替策を
>提示できるかもしれません。
#!/usr/bin/ruby
class Foo
def g
"g"
end
def p
"p"
end
end
f=Foo.new
str="g"
eval("ret=f.#{str}")
puts ret
上記の様に、変数strの内容によってメソッドを変える式を条件分岐文を使わずに書きたかったのですが、以下の様に書けばよいのかと。
ret=eval("f.#{str}")
ただ、この例だと、strに"g","p"以外を代入した際のキレイなエラー処理が知らなずでして。。
No.6
- 回答日時:
ちょっとだけ改良
class Quux
def g
"g"
end
def p
"p"
end
def call(fname)
begin
method(fname).call
rescue NameError
"#{fname}なんてメソッドないじゃないですか"
end
end
end
f = Quux.new
puts "test #{f.class}"
for fnc in %w[g n p]
ret = f.call(fnc)
puts ret
end
実行例:
test Quux
g
nなんてメソッドないじゃないですか
p
No.5
- 回答日時:
きれいなエラー処理ってのが具体的にどういうものなのか
思い浮かびませんが、こんなのではどうですか?
#!/usr/bin/ruby -Ks
class Foo
def g
"g"
end
def p
"p"
end
def method_missing(arg)
"#{arg} なんて呼んでんじゃねえぞゴルァ"
end
end
class Bar
def g
"g"
end
def p
"p"
end
def call(fname)
if (@fnctable.has_key?(fname))
@fnctable[fname].call
else
"#{fname}なんてメソッドないよ"
end
end
def initialize
@fnctable = {
'p' => method(p),
'g' => method(g)
}
end
end
f = Foo.new
puts "test #{f.class}"
for fnc in %w[g n p]
ret = eval("ret=f.#{fnc}")
puts ret
end
f = Bar.new
puts "test #{f.class}"
for fnc in %w[g n p]
ret = f.call(fnc)
puts ret
end
話すと長くなりますので書きませんが、evalは乱用しない方が
いろいろ都合が良いので、できるだけ使わない方向で
考えてみるのも良いと思います。
上の、後のほうの例だと呼び出しが美しくないですけどね。
PerlとかPythonだと .call() とかつけんでもよいのですが。
No.2
- 回答日時:
やってみたけど、エラーにならんかったよ。
irb>str='hoge="abc"'
=> "hoge=\"abc\""
irb>eval str
=> "abc"
irb>puts hoge
=> "abc"
とりあえず、環境と Ruby のバージョンを補足にどうぞ。
ちなみに上の結果は windowsXP Professional で Ruby のバージョンは 1.8.6 patchlevel 0
No.1
- 回答日時:
読んでも俺には良く解らなかったけど
ruby 1.9.0 (2006-04-15)では
hoge = '';
str = 'fuga';
str='hoge="abc";';
eval(str);
puts hoge;
という風に事前に一行加えたら代入されていることが確認できた。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像生成AIのプロンプトの作り...
-
pythonでのローカルファイルか...
-
vba 正規表現について教えてく...
-
if関数とは?
-
プログラミングに興味があるの...
-
uwscでPauseキーが押されたら、...
-
Fortranでシステム時刻をカレン...
-
数行削除してコピーするbatファ...
-
秀丸エディターでの置き換え
-
vba クリップボードクリアにつ...
-
Geminiフォーム 画像生成で 人...
-
Python 3.12.2 か一番最新のパ...
-
AIがプログラムする時代のプロ...
-
pythonについて(初心者です)
-
pythonでhtmlファイルの指定文...
-
プログラム上での行のマージ方法
-
覚えることが少ないプログラミ...
-
従業員が1名だけのSierっている...
-
アルゴリズムとコードとは何で...
-
IT業で開発をされてる方々に質...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「arg」は何の略?
-
VBA/GetTickCountの49.7日の境...
-
Ruby Selenium 要素の待機
-
例外の再スロー時に、その原因...
-
プログラミング言語 R
-
SMLのエラーについて
-
.size .atとは?(挿入ソート)
-
rubyについて質問です
-
Rubyでクラスファイルをディレ...
-
【ruby】【文法?】ブロックをb...
-
計算の途中経過を表示
-
ブロック2 Ruby認定試験対策問題
-
ヒープの質問です(難易度高)
-
ブロックローカル変数
-
【ruby】 『クラスの生成に失...
-
What class are you in? には何...
-
教えてください。vb5.0
-
class roomとclassroom どちら...
-
pythonのerrorコード
-
HSTLやSSTL等のI/Oピン
おすすめ情報