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で質問しましょう!
似たような質問が見つかりました
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- その他(プログラミング・Web制作) -sオプション 1 2022/06/06 12:49
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- UNIX・Linux cronでシェルスクリプト実行時のkubactlコマンドが機能しない対処法。 2 2022/08/03 18:58
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- オープンソース Vue+Laravelのデザインテンプレートのサンプルが起動できない 1 2022/05/18 21:52
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- C言語・C++・C# Lispの、evalはどのようにすごいですか? 3 2022/09/12 21:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python3について。
-
文系のSE志望です。プログラミ...
-
python3について。
-
vba クリップボードクリアにつ...
-
chatGPTで次々と質問をしていく...
-
Google ColaboでGUI作成
-
このプログラミング言語のfor分...
-
プログラミングサイトについて。
-
プログラミングのPythonのnoteb...
-
【プログラミングScratch】で音...
-
Pythonのコードエラーについて...
-
プログラム言語について。
-
Webサイト内に埋め込んだmp4動...
-
IT業界より楽に稼げる業界って...
-
楽しくて最高のプログラミング...
-
小学1年生の子です。塾に行かせ...
-
Python - Excel で Webからデー...
-
入力された文字列が、LD22000を...
-
VBA 電話番号の正規表現について
-
プログラミング ソースコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「arg」は何の略?
-
例外の再スロー時に、その原因...
-
fortranを用いた行列の掛け算に...
-
pythonのプログラミング
-
英語訳をおねがいします
-
【ruby】クラスCGIを改造したい
-
【ruby】無名関数?でブロック...
-
rubyについて質問です
-
.size .atとは?(挿入ソート)
-
Rubyでクラスファイルをディレ...
-
ブロックローカル変数
-
計算の途中経過を表示
-
VBA/GetTickCountの49.7日の境...
-
Ruby Selenium 要素の待機
-
cos波表示について マクローリ...
-
Ruby Selenium リンクの取得方法
-
Ruby インスタンス変数@fooを...
-
【Ruby】基本的な質問 数字を...
-
SMLのエラーについて
-
Ruby evalで代入
おすすめ情報