[解決済み] Rubyのローカル変数が未定義である
2022-01-28 10:26:26
質問
以下のようなRubyのコードを持っています。
local_var = "Hello"
def hello
puts local_var
end
hello
以下のようなエラーが発生します。
local_variables.rb:4:in 'hello': undefined local variable or method 'local_var'
for main:Object (NameError) from local_variables.rb:7:in '<main>'
ローカル変数は、ブロック、関数、クロージャなどの外からアクセスできないものだとばかり思っていました。
しかし、今、私はファイル内でローカル変数を定義し、関数からアクセスを取得しようとしました。 INSIDE を実行すると、同じファイルが作成されます。
私の理解は間違っているのでしょうか?
どうすればいいですか?
Rubyのローカル変数は、その変数が定義されているスコープでのみアクセス可能です。クラスやモジュール、メソッドの定義に入ったり出たりするたびに、Ruby ではスコープが変わります。
例えば、以下のような場合です。
v1 = 1
class MyClass # SCOPE GATE: entering class
v2 = 2
local_variables # => ["v2"]
def my_method # SCOPE GATE: entering def
v3 = 3
local_variables # => ["v3"]
end # SCOPE GATE: leaving def
local_variables # => ["v2"]
end # SCOPE GATE: leaving class
この出入りするポイントをスコープゲートと呼ぶ。メソッド定義によってスコープ・ゲートから入るので、自分の
local_var
内部
hello
メソッドを使用します。
スコープ・フラット化の概念を利用して、変数をこれらのゲートに通過させることができます。
例えば
def
を使ってメソッドを定義することができます。
Module#define_method
.
local_var = "Hello"
define_method :hello do
puts local_var
end
同じように、クラスも
Class#New
というように、クラス定義を通過しても、スコープが変わらないようにします。
local_var = 'test'
MyClass = Class.new do
puts local_var #valid
end
ではなく
class MyClass
puts local_var #invalid
end
同じように
Module#New
は、モジュールゲートを介してローカル変数を渡したい場合。
この例は メタプログラミング Ruby
関連
-
[解決済み] Ruby - 文字列を日付に変換する
-
[解決済み] Ruby で Fixnum から String への暗黙の変換ができない (TypeError)
-
[解決済み] Rubyでファイルを移動するにはどうしたらいいですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] if文の中で初期化された変数のスコープとは?
-
[解決済み】ローカル変数のメモリはスコープ外からアクセスできる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] -bashです。/Users/myname/.bash_profile: パーミッションが拒否されました
-
[解決済み] RMagickのインストール。MagickWand.hが見当たりません。
-
[解決済み] rubyでディレクトリからすべてのファイルを要求する最良の方法?
-
[解決済み] nil から String への暗黙の変換ができないエラー
-
[解決済み] Ruby on Railsでホスト名やIPを取得する
-
[解決済み] Ruby: 文字列をブーリアンに変換する方法
-
[解決済み] Rubyで2次元配列の作成と反復処理
-
[解決済み] OpenSSL AES-256-CBC 暗号化エラー、"間違った最終ブロック長" Ruby
-
[解決済み] プロキシ(ISA-NTLM)の後ろからRuby Gemsをアップデートする方法
-
[解決済み] Rubyにバイナリ検索は組み込まれていますか?