単純な答えです:いいえ、ローカル変数にアクセスする方法はありませんfoo
スクリプトのスコープではprint_foo
メソッドのメソッドスコープから取得します。 foo
はローカル変数ですが、ローカル変数は定義されているスコープに対してローカルなので、結局はローカル変数と呼ばれています。
foo
は、スクリプトスコープで定義されています。 print_foo
のメソッドスコープには定義されていませんが、print_foo
からはアクセスできません。
Rubyには、スクリプト、モジュール/クラス定義、メソッド定義、ラムダリテラル/ブロックボディという4つのローカル変数スコープがあります。これら4つのうち、スクリプトスコープ、モジュール/クラススコープ、およびメソッドスコープは新しいスコープを作成します。ラムダリテラルとブロック、これらの2つは、周囲のレキシカルスコープからローカル変数にアクセスできる入れ子スコープを作成します。
ので、print_foo
にfoo
へのアクセスを取得する唯一の方法は、print_foo
はブロック内で、すなわち、ネストされたスコープで定義されていることを確認することで、全ての周囲のスコープもブロックされていること。ありがたいことに、ブロックをとり、また、ブロックかかりModule::new
と呼ばれるモジュールを定義するための方法があるModule#define_method
呼び出されるメソッドを定義する方法(又はこの場合には実際Object#define_singleton_method
)がある。
とにかくアクセスにありfoo
からGetVar.print_foo
?
foo = "test"
GetVar = Module.new do
define_singleton_method(:print_foo) do puts foo end
end
GetVar.print_foo
# test
実は、私たちもModule::new
のブロック形式を必要としない:
foo = "test"
GetVar = Module.new.tap do |m| m.define_singleton_method(:print_foo) do puts foo end end
GetVar.print_foo
# test
あなたは 'デフself.fooを追加することができます。 "テスト";モジュール内の「終わり」にある。 –
@CarySwovelandいいえ、その原因私はfooを定義していません - 実際には 'verify_recaptcha'ですが、別の宝石から来ています。私はrecaptcha gemを使用していますが、 'verify_recaptcha'を呼び出すヘルパーメソッドを作成しようとしていますが、ヘルパー関数はrecaptcha gemから必要な機能を持たない新しいスコープを作成します。 –
@ChristianJuthローカル変数は、メソッドへの現在の呼び出しに対してローカルであり、トップレベルのバインディングに対してローカルであれば、トップレベルのバインディングに対してローカルです。他の場所にはアクセスできないし、アクセスすべきでもない。 – Aetherus