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

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

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

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

Q&A

解決済

1回答

962閲覧

クラス変数を読み込めない。

tkshp

総合スコア174

Ruby

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

0グッド

0クリップ

投稿2020/02/06 01:08

編集2020/02/06 01:08

前提・実現したいこと

外部クラスを読み込んで、その中のクラス変数を使いたいのですが、未定義エラーになってしまいます。
ご教示お願いします。

試したこと

sample.rb

ruby

1class Sample 2 @@key = "mykey" 3end

test.rb

ruby

1 require "./sample" 2 puts Sample.key

エラーメッセージ

#<NoMethodError: undefined method `key' for Sample:Class>

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

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

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

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

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

guest

回答1

0

ベストアンサー

外部クラスを読み込んで、その中のクラス変数を使いたいのですが、未定義エラーになってしまいます。

はい、クラス変数は(class_variable_geteval系の手段を使わない限り)外部から読み書きできません

Sample.keyのようにアクセスしたいなら、そういうクラスメソッドを立てる必要があります。

投稿2020/02/06 01:10

maisumakun

総合スコア145208

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

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

tkshp

2020/02/06 01:25

ご回答ありがとうございます。 class_variable_getの使い方は検索してわかったのですが、evalはどういう書き方のことですか? 下記のような使い方のことですか? class ClassEvalSample; end ClassEvalSample.class_eval { def hello; "Hello, everyone !"; end } puts ClassEvalSample.new.hello
maisumakun

2020/02/06 01:30

そこまでしなくても、「Sample.instance_eval('@@key')」のようなやり方で大丈夫です。 とはいえ、そもそも、クラス変数自体が継承で共有されるなど扱いづらいものです。「どうしてもクラス変数でないといけない」というわけではないのでしたら、ActiveSupportのclass_variableなど代替手段を考えたほうがいいかもしれません。
tkshp

2020/02/06 01:45

ご回答ありがとうございます。 そのような書き方なのですね、ありがとうございます。 ActiveSupportのclass_variableを検索してみましたが、配列で取得されるということですか? https://qiita.com/rsooo/items/ce4f3c0028312d513e3b クラス変数でなく、インスタンス変数で取得に変更しようか考えているのですが、 その場合、アクセサには変数を1個1個全て羅列しなければならないですか? そのクラス内のインスタンス変数を全て読み取り専用にしたいのですが、一括で書く書き方はありますか? attr_reader :変数名1, 変数名2, 変数名3, 変数名4
tkshp

2020/02/06 01:57

ご回答ありがとうございました。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問