2016-05-29 2 views
1

をmethod_missingと一緒に「=」メソッドを実装しますこのようなものはSettings.user = "some_user"は、私は次のようにモジュール<code>Settings</code>をしました

私はこれを追加しようとしました:

def method_missing=(name, *args, &block) 
    #some code to assign the value 
end 

残念ながら、これは機能しません。 (unknown configuration root user= (NoMethodError))。これを行う「正しい」方法は何ですか?

答えて

2

存在しない方法を指すsomething=のメソッド名は、まだmethod_missingで捕捉されます。

method_missingを修正して、名前が '='で終わるかどうかを確認し、それに応じて動作させることができます。あなたがSettings.method_nameを言うならば、あなたはそのモジュールが含まれ、インスタンスSettingsモジュール上のメソッドを呼び出すとされていない、と述べた

また、モジュールには状態は含まれません。これはクラスと区別するためのものの1つです。また、包含クラスのメソッドmethod_missingをオーバーライドする(または、クラスのメソッドが優先される場合は無視する)ことをお勧めしますか?

このためにモジュールを使用する理由を説明できますか?代わりに、クラスを定義し、そのクラスを使用するクラスでそのクラスのインスタンス(継承ではなくコンポジション)を含めることができますか?

+0

アプリケーションはcliツールです。設定モジュールは、コマンドラインオプションを解析し、それらをアプリケーションに提供します。継承されないか、他のクラス/モジュールに含まれます。それはちょうど必要です。 –

+0

私は、あなたが使用しているモジュールアプローチが、必要以上に複雑になる*方法を追加すると思います。このために 'OpenStruct'を使うことができます。 http://ruby-doc.org/stdlib-2.0.0/libdoc/ostruct/rdoc/OpenStruct.htmlで確認してください。私はコマンドラインオプションのためにこれを常に使用しています。 –

0

簡単な答えは、Rubyで=を上書きすることはできないということです。これらのタイプの演算子をオーバーライドすることは危険であると考えられています。詳細は、this answerを参照してください。

ただし、この正確な使用例は、rubyでうまく処理されます。それは、他の半分はattr_writerことでattr_accessorの半分であるあなたがattr_readerとほとんどそこにいる

def user= (some_object) 
    @_settings = {user: some_object} 
end 

またはユーザーにSettingの属性を作成し、attr_accessor

module Settings 
    attr_accessor :user 
    def new(user) 
    @user = user 
    end 
end 

を使用する:2つのオプションがあります。それ以外のものをチェックしてくださいSO thread

関連する問題

 関連する問題