>|ruby|

def foo
instance_eval %Q{ a = "a" }
instance_eval %Q{ puts a }
end

foo
||<

>|ruby|
def foo
instance_eval { a = "a" }
instance_eval { puts a }
end

foo
||<

上記の2つのコードは動作が異なるのですが、その理由を教えてください。

回答の条件
  • 1人5回まで
  • 登録:2007/03/05 15:27:50
  • 終了:2007/03/05 22:38:10

回答(2件)

id:Bookmarker No.1

しおり回答回数191ベストアンサー獲得回数342007/03/05 17:10:53

ポイント50pt

Rubyリファレンスマニュアル - メソッド呼び出し: ブロック付きメソッド呼び出し

ブロックの中で初めて代入された(宣言された)ローカル変数はそのブロックの中でだけ有効です。

id:winebarrel

回答ありがとうございます。

ローカル変数をブロックで定義するのは無理ってことですかね…

(instance_evalでローカル変数が『どこ』に定義されているか、いまいちよくわかっていないですが…)

2007/03/05 17:38:42
id:Bookmarker No.2

しおり回答回数191ベストアンサー獲得回数342007/03/05 18:35:01

ポイント60pt

ローカル変数をブロックで定義するのは無理ってことですかね…

いや、ローカル変数はブロック内でも宣言できますし、提示された2つ目のスクリプトでもちゃんと宣言されてますよ。

ただ、

ブロックの中で初めて代入された(宣言された)ローカル変数はそのブロックの中でだけ有効です。

なので、1つ目の instance_eval に渡したブロック内で宣言されたローカル変数 a は、2つ目の instance_eval に渡したブロック内からはアクセスできないだけです。(もう寿命も尽きてるし)

両方のブロックから同じローカル変数 a にアクセスしたいのなら、その外で宣言すれば良いです。

def foo
  a = ""
  instance_eval { a = "a" }
  instance_eval { puts a }
end

foo

(instance_evalでローカル変数が『どこ』に定義されているか、いまいちよくわかっていないですが…)

等をじっくり読んでみてください。

id:winebarrel

再回答、丁寧な説明ありがとうございます。

メソッドfooで変数aを宣言しないで、ブロック内で変数aを宣言して、メソッドfooのスコープ(または、似たような範囲のスコープ)で変数aを使う、ということがやりたかったんですが、無理っぽいですね。

言葉足らずで失礼しました。

2007/03/05 19:28:39

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません