回答編集履歴

6

修正

2020/01/22 05:13

投稿

rhiroe
rhiroe

スコア2349

test CHANGED
@@ -58,6 +58,8 @@
58
58
 
59
59
  `NameError(uninitialized constant)`が発生する経緯をさらに追記すると、
60
60
 
61
- 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されるメソッドモジュールメソッドやモジュール関数と呼ばれる`Module`オブジェ特異メソッドのようなものです。
61
+ 今回の`M`や`m`といったは`Module`クラスインスタンスです。
62
62
 
63
+ それに対して`instance_eval`を使ってメソッド定義した場合、定義されるメソッドはそのオブジェクト限定の`Module`クラスのインスタンス変数となります。
64
+
63
- で、その辺りの関係性がよくわからないで本当に自信がないんですが、モュールメソッドからモジュール定数を参照できないのでこのエラーが出ているんだと思います。
65
+ で、`Module`クラスからはそオブェクト義された定数を参照できないので`uninitialized constant`と言われるんだと思います。

5

修正

2020/01/22 05:13

投稿

rhiroe
rhiroe

スコア2349

test CHANGED
@@ -58,10 +58,6 @@
58
58
 
59
59
  `NameError(uninitialized constant)`が発生する経緯をさらに追記すると、
60
60
 
61
- 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されるメソッドはモジュールメソッドやモジュール関数と呼ばれる`Module`の特異メソッドのようなものであり、ひいては`Module`は`Class`クラスのインスタンスであるため、`Class`クラスのインスタンスメソッドのようなものになります。
61
+ 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されるメソッドはモジュールメソッドやモジュール関数と呼ばれる`Module`オブジェクトの特異メソッドのようなものです。
62
62
 
63
-
64
-
65
- で、`Class`クラスからは`Module`オブェクト内の`CONST`定数参照できないので
63
+ で、その辺りの関係性がよくわからないので本当に自信がないんですが、モュールメソッドからモジュール内の定数参照できないのでこのエラーが出ているんだと思います。
66
-
67
- `uninitialized constant`となります。

4

変なこと言ってたので修正

2020/01/22 04:56

投稿

rhiroe
rhiroe

スコア2349

test CHANGED
@@ -50,15 +50,15 @@
50
50
 
51
51
 
52
52
 
53
- `NameError(uninitialized constant)`が発生する経緯をさに追記する
53
+ 説明見返したおかしなこを言っていたので修正しました。
54
54
 
55
- 今回`M`や`m`とったモジュールは`Class`クラスインスタンスです。
55
+ これ以降説明は自信がないのでわかる方いたら修正をお願いします。
56
56
 
57
57
 
58
58
 
59
- で、`Class`クラスのインスタンスいうことは
59
+ `NameError(uninitialized constant)`が発生する経緯をさらに追記すると、
60
60
 
61
- `instance_eval`定義されメソッドは`Class`クラスのインスタンスメソッドになるわけです。
61
+ 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されメソッドはモジュールメソッドやモジュール関数と呼ばれる`Module`の特異メソッドのようなものであり、ひいては`Module`は`Class`クラスのインスタンスであるため、`Class`クラスのインスタンスメソッドのようなものになります。
62
62
 
63
63
 
64
64
 

3

脱字修正

2020/01/22 04:51

投稿

rhiroe
rhiroe

スコア2349

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- `NameError(uninitialized constant)`が発生する経緯さらに追記すると、
53
+ `NameError(uninitialized constant)`が発生する経緯さらに追記すると、
54
54
 
55
55
  今回の`M`や`m`といったモジュールは`Class`クラスのインスタンスです。
56
56
 

2

追記

2020/01/22 04:40

投稿

rhiroe
rhiroe

スコア2349

test CHANGED
@@ -45,3 +45,23 @@
45
45
  ```
46
46
 
47
47
  とすれば同じエラーが起きます。
48
+
49
+
50
+
51
+
52
+
53
+ `NameError(uninitialized constant)`が発生する経緯さらに追記すると、
54
+
55
+ 今回の`M`や`m`といったモジュールは`Class`クラスのインスタンスです。
56
+
57
+
58
+
59
+ で、`Class`クラスのインスタンスということは、
60
+
61
+ `instance_eval`で定義されたメソッドは`Class`クラスのインスタンスメソッドになるわけです。
62
+
63
+
64
+
65
+ で、`Class`クラスからは`Module`オブジェクト内の`CONST`定数は参照できないので
66
+
67
+ `uninitialized constant`となります。

1

追記

2020/01/22 04:40

投稿

rhiroe
rhiroe

スコア2349

test CHANGED
@@ -21,3 +21,27 @@
21
21
  ```
22
22
 
23
23
  ならば同じような動きになると思います。
24
+
25
+
26
+
27
+ 逆に
28
+
29
+ ```rb
30
+
31
+ m = Module.new { |obj| obj::CONST = "Constant in Module instance" }
32
+
33
+ m.instance_eval(<<-EOS)
34
+
35
+ def const
36
+
37
+ CONST
38
+
39
+ end
40
+
41
+ EOS
42
+
43
+ p m.const
44
+
45
+ ```
46
+
47
+ とすれば同じエラーが起きます。