0

別のスコープ内で定義されたブロックからオブジェクトにアクセスする方法はありますか? わかりにくい場合は申し訳ありませんが、少し例を示します。

def scope(&block)
  foo = "bar"
  instance_eval &block
end

scope do
  puts "foo is #{foo}"
end

出力を取得したい:

"foo is bar"

出来ますか?

4

1 に答える 1

2

本当の問題はあなたが何をしようとしているのかですが、あなたが得ることができる最も近いものはこれです:

def scope
  @foo = "bar"
  yield
end

scope do
  puts "foo is #{@foo}"
end

@fooローカル変数の代わりにインスタンス変数を使用していることに注意してください。次のように明示的にアクセスしない限り、インスタンス変数にアクセスすることはできません。

def scope
  foo = "bar"
  yield foo
end

scope do |foo|
  puts "foo is #{foo}"
end

しかし、これは良いことです。そうしないと、ローカル変数との競合を回避することが困難になります。

&block注:また、明示的な使用を暗黙的な使用に置き換えましたyield。フォームにはブロックが存在する必要があり、yield構文はより単純ですが、主にスタイルの問題です。

于 2012-08-28T17:03:24.867 に答える