質問するログイン新規登録
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1734閲覧

Rubyの「module_eval」について

hoge_nakatani

総合スコア63

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2020/01/18 10:55

1

1

module A B = 42 def f 21 end end A.module_eval do def self.f p B end end B = 15 A.f

こちらのコードですが出力結果が「15」になりますがなぜそうなるのかがわかりません。
「A.module_eval do ~ end」では
「Aモジュールの特異メソッドf」が定義されてると思います。
Aモジュールの元の中身は

module A B = 42 def f 21 end end

なので
「A.f」で出力されるのは"42"だと思ったのですが、なぜ15になるのでしょうか?

module A # ①モジュールAの定義 B = 42 # ②モジュールAに定数Bを定義。Bに42を代入してる。 def f 21 end end A.module_eval do # ③モジュールAに特異メソッドfを定義 def self.f p B # ④42が出力 end end B = 15 A.f

このような考えになってます。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リファレンスマニュアルにその答えが書いてあります。

Module#class_eval | Ruby 2.7.0 リファレンスマニュアル

ブロックが与えられた場合には、定数とクラス変数のスコープはブロックの外側のスコープになります。

(リンク先が class_eval になってますが、 class_eval と module_eval は同じメソッドです)

投稿2020/01/18 11:33

shinoharat

総合スコア1685

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問