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

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

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

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

Q&A

解決済

1回答

1183閲覧

Ruby クラスのインスタンスメソッドをmoduleプライベートに定義する方法

ib-t-s

総合スコア9

Ruby

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

0グッド

1クリップ

投稿2018/08/23 08:31

編集2018/08/23 08:50

前提・実現したいこと

Rubyで、同じモジュール内からのみアクセスできるような、モジュール内クラスのインスタンスメソッドを定義したい

該当のソースコード

ruby

1module Sample 2 class A 3 def foo 4 puts 'boo' 5 end 6 def bar 7 self.foo 8 end 9 end 10 class B 11 def bar 12 A.new.foo 13 end 14 end 15end

上記のコードに対して、

ruby

1A.new.bar # -> 'boo' 2B.new.bar # -> 'boo' 3A.new.foo # -> エラーか例外が出る

となるようにしたいのです。
Javaでいうところのアクセス修飾子をつけない状態に近いでしょうか。

補足(本当にやりたいこと)

module 内に、
クラスA:とあるデータ構造を表現
クラスB:外部から与えられる入力をもとにAのインスタンスを作成
があり、B から A に対して、A の色々なメソッド(主に各種setter)を呼びたいのです。
が、これらのsetterは外部からは呼べないようにしたい(想定外の使われ方を排除したい)、さてどうするか、というのが本当にやりたいことになります。

ですので、そういう場合はRubyではこういう風に書くのが定番だよ、という答えでも構いません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

これらのsetterは外部からは呼べないようにしたい(想定外の使われ方を排除したい)

Rubyで厳密に行うのは不可能です。というのも、__send__を使えばprivateだろうが呼べてしまいますし、instance_variable_setなんていうメソッドすら用意されているぐらいだからです。

「意図してprivateを呼ぶ人は無視していい(うっかりそのメソッドを使わないようにする程度で十分)」というのであれば、メソッドをprivateにしておいて__send__で呼ぶ、という形になるかと思います。

投稿2018/08/23 09:03

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問