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

回答編集履歴

6

修正

2020/01/22 05:13

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -28,5 +28,6 @@
28
28
  これ以降の説明は自信がないのでわかる方いたら修正をお願いします。
29
29
 
30
30
  `NameError(uninitialized constant)`が発生する経緯をさらに追記すると、
31
+ 今回の`M`や`m`といったは`Module`クラスのインスタンスです。
31
- 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されるメソッドはモジュールメソッドやモジュール関数と呼ばれる`Module`オブジェクトの特異メソッドようものです。
32
+ それに対して`instance_eval`を使ってメソッド定義した場合、定義されるメソッドはそのオブジェクト限定`Module`クラスインスタンス変数とります。
32
- で、その辺りの関係性がよくわからないで本当に自信がないんですが、モュールメソッドからモジュール定数を参照できないのでこのエラーが出ているんだと思います。
33
+ で、`Module`クラスからはそオブェクト義された定数を参照できないので`uninitialized constant`と言われるんだと思います。

5

修正

2020/01/22 05:13

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -28,7 +28,5 @@
28
28
  これ以降の説明は自信がないのでわかる方いたら修正をお願いします。
29
29
 
30
30
  `NameError(uninitialized constant)`が発生する経緯をさらに追記すると、
31
- 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されるメソッドはモジュールメソッドやモジュール関数と呼ばれる`Module`の特異メソッドのようなものであり、ひいては`Module`は`Class`クラスのインスタンスであるため、`Class`クラスのインスタンスメソッドのようなものになります。
31
+ 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されるメソッドはモジュールメソッドやモジュール関数と呼ばれる`Module`オブジェクトの特異メソッドのようなものです。
32
-
33
- で、`Class`クラスからは`Module`オブェクト内の`CONST`定数参照できないので
32
+ で、その辺りの関係性がよくわからないので本当に自信がないんですが、モュールメソッドからモジュール内の定数参照できないのでこのエラーが出ているんだと思います。
34
- `uninitialized constant`となります。

4

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

2020/01/22 04:56

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -24,11 +24,11 @@
24
24
  とすれば同じエラーが起きます。
25
25
 
26
26
 
27
+ 説明見返したらおかしなことを言っていたので修正しました。
28
+ これ以降の説明は自信がないのでわかる方いたら修正をお願いします。
29
+
27
30
  `NameError(uninitialized constant)`が発生する経緯をさらに追記すると、
28
- 今回の`M`や`m`といったモジュールは`Class`クラスのインスタンスです。
31
+ 今回の`M`や`m`といったモジュールの中で`instance_eval`を使ってメソッド定義した場合、定義されるメソッドモジュールメソッドやモジュール関数と呼ばれる`Module`の特異メソッドのようなものであり、ひいては`Module`は`Class`クラスのインスタンスであるため、`Class`クラスのインスタンスメソッドのようなものになります。
29
32
 
30
- で、`Class`クラスのインスタンスということは、
31
- `instance_eval`で定義されたメソッドは`Class`クラスのインスタンスメソッドになるわけです。
32
-
33
33
  で、`Class`クラスからは`Module`オブジェクト内の`CONST`定数は参照できないので
34
34
  `uninitialized constant`となります。

3

脱字修正

2020/01/22 04:51

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -24,7 +24,7 @@
24
24
  とすれば同じエラーが起きます。
25
25
 
26
26
 
27
- `NameError(uninitialized constant)`が発生する経緯さらに追記すると、
27
+ `NameError(uninitialized constant)`が発生する経緯さらに追記すると、
28
28
  今回の`M`や`m`といったモジュールは`Class`クラスのインスタンスです。
29
29
 
30
30
  で、`Class`クラスのインスタンスということは、

2

追記

2020/01/22 04:40

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -21,4 +21,14 @@
21
21
  EOS
22
22
  p m.const
23
23
  ```
24
- とすれば同じエラーが起きます。
24
+ とすれば同じエラーが起きます。
25
+
26
+
27
+ `NameError(uninitialized constant)`が発生する経緯さらに追記すると、
28
+ 今回の`M`や`m`といったモジュールは`Class`クラスのインスタンスです。
29
+
30
+ で、`Class`クラスのインスタンスということは、
31
+ `instance_eval`で定義されたメソッドは`Class`クラスのインスタンスメソッドになるわけです。
32
+
33
+ で、`Class`クラスからは`Module`オブジェクト内の`CONST`定数は参照できないので
34
+ `uninitialized constant`となります。

1

追記

2020/01/22 04:40

投稿

rhiroe
rhiroe

スコア2352

answer CHANGED
@@ -9,4 +9,16 @@
9
9
  CODE
10
10
  p M::say
11
11
  ```
12
- ならば同じような動きになると思います。
12
+ ならば同じような動きになると思います。
13
+
14
+ 逆に
15
+ ```rb
16
+ m = Module.new { |obj| obj::CONST = "Constant in Module instance" }
17
+ m.instance_eval(<<-EOS)
18
+ def const
19
+ CONST
20
+ end
21
+ EOS
22
+ p m.const
23
+ ```
24
+ とすれば同じエラーが起きます。