私は、とりわけ、いくつかの一般的な「ファインダー」タイプの機能を、それをミックスするクラスに追加するモジュールに取り組んでいます。問題: 利便性と美学の理由から、クラス自体と同じスコープで、クラスの外部にいくつかの機能を含めたいと考えています。
例えば:
class User
include MyMagicMixin
end
# Should automagically enable:
User.name('Bob') # Returns first user named Bob
Users.name('Bob') # Returns ALL users named Bob
User(5) # Returns the user with an ID of 5
Users # Returns all users
これらのメソッド内で機能を実行できますが、問題ありません。そして、ケース 1 ( User.name('Bob')
) は簡単です。ただし、ケース 2 ~ 4 では、 の外部で新しいクラスとメソッドを作成できる必要がありますUser
。このModule.included
メソッドは、クラスへのアクセスを提供しますが、それを含むスコープへのアクセスは提供しません。クラスやモジュールで確認できる単純な「親」タイプのメソッドはありません。(名前空間については、つまり、スーパークラスでもネストされたモジュールでもありません。)
これを行う最善の方法は、クラスの文字列を解析し#name
て名前空間を分割し、文字列を定数に戻すことです。しかし、それは不器用に思えます。これが Ruby であることを考えると、もっとエレガントな方法があるべきだと思います。
誰にもアイデアはありますか?それとも、自分の利益のために賢すぎるだけですか?