質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Q&A

解決済

2回答

236閲覧

Rubyの勉強をしています。。モジュールの中のメソッドを使いたい

tuvalu

総合スコア136

Ruby

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

0グッド

0クリップ

投稿2017/07/04 09:11

ただいま、Rubyの試験にトライしようと、勉強しています。
https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_41_50.html
CTC教育サービスさんの問題を解いていて、わからないので教えてください

この、[コード2]で、モジュールMの中のメソッドを使ってエラーとならないように、
[コード1]と同じ結果(foo)になるようにするには、
Foo.new.foo のところをどのように直せばよろしいのでしょうか?
教えてください。よろしくお願い致します。

問41.以下の2つのコードの実行結果の出力として正しいものを選択してください。

[コード1]
class Foo
Const = "foo"
def foo
puts Const
end
end
Foo.new.foo

[コード2]
module M
def foo
puts Const
end
end
class Foo
Const = "foo"
include M
end
Foo.new.foo

1. [コード1]

foo
[コード2]
foo
2. [コード1]
例外が発生する
[コード2]
foo
3. [コード1]
foo
[コード2]
例外が発生する
4. [コード1]
例外が発生する
[コード2]
例外が発生する

問41の解答と解説
解答:3

解説 コード1のfooメソッドはクラス内で定義した定数Constを参照しておりますので、エラーになりません。 コード2のfooメソッドはモジュール内で定義した定数Constを参照してしまい、未定義なのでエラーになります。

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

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

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

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

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

guest

回答2

0

はずしてるかもしれませんが....
(どっちにしてもコード2をなおしてます)

module M def foo puts self.class::Const # ここを変えた end end class Foo # Fooクラスのクラスの定数(変数)なので Foo::Const で参照になる Const = "foo" include M end Foo.new.foo # “foo” が返る Foo::Const # これも “foo” が返る

Moduleのfooメソッドをincludeするクラス自体がConstというクラス定数を持ってるとしまして、Module側からそれを参照する場合はこうなるかな?と思いました。

投稿2017/07/04 23:12

suama

総合スコア1997

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

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

0

ベストアンサー

Ruby

1module M 2 def foo 3 puts Const 4 end 5end 6 7class Foo 8 include M 9end 10 11Foo.new.foo

class FooのConstを削除したらいけました。
#勘違いでした

Ruby

1module M 2 Const = "foo" 3 def foo 4 puts Const 5 end 6end 7 8class Foo 9 include M 10end 11 12Foo.new.foo

moduleの中にConstを入れてみました。

Ruby

1module M 2 def foo(const) 3 puts const 4 end 5end 6 7class Foo 8 include M 9end 10 11Foo.new.foo('foo')

外からfooを入れるバージョン。

Ruby

1module M 2 def foo 3 puts $Const 4 end 5end 6 7class Foo 8 $Const = 'foo' 9 include M 10end 11 12Foo.new.foo

グローバル変数で貫通させる。

投稿2017/07/04 13:35

編集2017/07/04 13:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tuvalu

2017/07/04 22:30

おはようございます。ご回答ありがとうございます。 ごめんなさい。ぼくの質問の仕方が悪いです。 [コード2]は与えられているので、そのままで、 [コード1]と同じく結果が、foo となるようにしたいとき どのようなコードにすればいいですか? なんか、問題自体はわかった気になっているんですが、 かと言って応用できるかというと、全然そうではなく 止まってしまっています。こういうところがわかれば いいなと思っています。よろしくお願い致します。
tuvalu

2017/07/04 22:42

さらに厳密に言うと、Foo.new でオブジェクト作って、 それからmodule M のメソッドの foo を使って 結果が foo となるようにしたいです。 変な質問ですみません。。
tuvalu

2017/07/04 22:50

これは、[コード2]自体が誤りで、h_aさんの言われる通り、 [コード2]の方を直さないと実現できない、ということで よろしいんでしょうか?
tuvalu

2017/07/04 23:10

Foo.new.foo NameError: uninitialized constant M::Const となるので、やっぱり、h_aの言われる通り、 Const = "foo" が、module M の方にないとダメなんですね。 つまり、[コード2]自体が誤りなので、ぼくが求めていたことは まったく御門違いということです。わかってきました。ありがとうございます!
退会済みユーザー

退会済みユーザー

2017/07/05 06:40

どういたしまして。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問