人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

>|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つのコードは動作が異なるのですが、その理由を教えてください。

●質問者: winebarrel
●カテゴリ:コンピュータ
✍キーワード:def Ruby コード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● しおり
●50ポイント

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

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

◎質問者からの返答

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

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

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


2 ● しおり
●60ポイント

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

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

ただ、

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

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

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

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

foo

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

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

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ