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

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

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

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

Q&A

解決済

1回答

792閲覧

[Ruby]refineで定数を定義できない

y-doi

総合スコア322

Ruby

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

0グッド

0クリップ

投稿2018/11/07 07:25

Rubyのrefineで定数を定義したいです。

Ruby の refinements の使い途 - Qiita
の記事には、以下のように書いていました。

refine はメソッドだ。引数として,拡張したいモジュールを与える。もちろんクラスはモジュールの一種だから,クラスを与えることもできる。

そして,ブロックの中でメソッドを定義する。いや,メソッドだけでなく定数などを定義したっていい。

refineのブロックの中で定数も定義できるようなので、簡単なプログラムでやってみましたがwarningが発生していまい、期待の出力がされませんでした。

rb

1module Refinements 2 refine String do 3 CONSTANT = 'constant' 4 def foo 5 CONSTANT 6 end 7 end 8end 9 10using Refinements 11puts 'a'.foo
Main.rb:3: warning: not defined at the refinement, but at the outer class/module

どのようにすれば、refineで定数も定義できるのか教えていただきたいです。


warningの意味としては「refineの中で定義するのではなく、外のモジュールで定義しなさい」と意味でしょうか?
確かに、そのようにすればうまくいきました。

rb

1module Refinements 2 CONSTANT = 'constant' 3 refine String do 4 def foo 5 CONSTANT 6 end 7 end 8end 9 10using Refinements 11puts 'a'.foo 12#=> constant

その場合、上の記事は間違いということになると思いますが。

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

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

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

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

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

guest

回答1

0

ベストアンサー

当時は誤りではありませんでした

Bug #10103でrefineの仕様について再考された結果
Ruby2.4以降refineでクラス変数・定数については追加・上書きできなくなりました

投稿2018/11/07 08:24

asm

総合スコア15147

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

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

y-doi

2018/11/07 09:04 編集

回答ありがとうございます。途中で仕様が変わったからだったんですね。 もう一つお聞きしたいのですが、 貼っていただいたissueのページを見たのですが、2.4以降で今回の仕様になったのかという情報がどこに書いてあるかがわからなかったので、教えていただきたいです。
asm

2018/11/07 11:28

実は、探した経路は逆なんですけどね 「warning: not defined at the refinement」をソースコードから検索してblameからcommitを探し出して メッセージからチケットを
y-doi

2018/11/07 12:13

興味があるのでお聞きしたいのですが、 「ソースコードから検索」というのはGitHubのruby/rubyのリポジトリ内で、検索窓で「warning: not defined at the refinement」をin this repositoryで検索したという意味でしょうか。 そのようにやってみると、test/ruby/test_refinement.rbの行がヒットした中にあるのですが、そのblameを見られたということでしょうか。
y-doi

2018/11/08 09:01

ありがとうございます。今後の調べ方の参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問