Rubyオブジェクトのパブリック "プロパティ"を取得するより良い方法はありますか?Rubyオブジェクトのパブリック "プロパティ"を取得するより良い方法はありますか?
def props
self.public_methods.grep(/.=$/) - ["==","==="]
end
Rubyオブジェクトのパブリック "プロパティ"を取得するより良い方法はありますか?Rubyオブジェクトのパブリック "プロパティ"を取得するより良い方法はありますか?
def props
self.public_methods.grep(/.=$/) - ["==","==="]
end
まあ、Rubyには「プロパティ」はありません。そして、基本的には、あなたが言葉を作った(またはより正確には、あなたがRubyに適用されるようにその定義を構成した)ので、あなたはそれが何を意味するかを知ることができますが、それはまた、あなた自身のセマンティクスを実装しなければならないことを意味します。
"プロパティ"を "等号で終わるが排他的に等号ではない"という意味に定義すると、定義は可能な限り最良の方法です。 (ところで:「プロパティ」のあなたの定義には、またはあなたが望むものであってもなくてもよい<=
、>=
と!=
、などの方法を含む。)Rubyで
、あなたはカプセル化を破るためにメタプログラミングを行う場合を除き、唯一の方法は、変更します別のオブジェクトのインスタンス変数は、そうしたメソッドを呼び出すことです。メタプログラミングを使用せずに、メソッドによってどのインスタンス変数が変更されているかを知る方法はありません。例えば
私は人を持っていたし、そのクラスはメソッドheight_feet=
とその中のheight_meters=
を持っていた場合、私があれば、人の高さが@height_feet
または@height_meters
あるいは@height_cubits
に基づいていたというの実施を指示することができません。
これは良いことです。これは、実装ではなくインターフェイスに純粋にプログラムすることを意味します。
オブジェクトをシリアライズしたり、データマッパーを作成したい場合は、最も一般的な方法は何ですか?最も簡単なアプローチ? – BuddyJoe
@tyndall:別の質問だと思います。 –
あなたの正規表現は不完全です。単語の文字ではなく、任意の文字で始まるメソッドに一致します。すべての「作家」を取得するための最良の方法は、
methods.grep /^\w+=$/
だろうと正規表現は
methods.grep /\w=$/
に短縮、あまり明確であることができます。
正規表現は、開始時に '^'を持たないので、任意の長さのメソッド名と一致します。 –
正規表現内の '^'は、文字列の長さに完全に無関係で、特に行が1つしかないメソッド名では重要ではない文字列または行の先頭を示します。 – Tom
@Refactor:私はあなたの正規表現ではなく、tyndallの正規表現を参照するつもりでした。私はそれがすでにすべての「作家」と一致していると言っていました。 –
私は属性を意味すると思います。エクスポーズされたクラスの内部変数(public)。 YAMLのstdlibコードを見ていて、どこでループしているのかわかりません。私はそれがそこにあると確信していますが、私はそれを見つけることができません。 – BuddyJoe
小さな修正:!=は方法ではありません。 –
@ライアン:1.9でさえない? –