

ActiveRecordみたいな`Post.all`のように`new`を使わずに使えるクラスってどうやって作るのでしょうか。

例えば`Person`というクラスに対して何らかの定義をすることで、

[code]

    Person('yoshida').age
    
[/code]

とできるような使い方を考えています。

また、これの名前みたいなのはあるのでしょうか。インスタンスレスクラス的な。


CC BY-SA 3.0
2015-01-13T02:54:42.713
4466
2015-01-25T19:05:14.037
2015-01-25T14:12:00.427
30
7339
question
ruby
Rubyでnewを使わずにインスタンス化できるクラスの作り方


インスタンスメソッドではなくクラスメソッドを作ります。

[code]

    class Post
      def self.all
        [1,2,3]
      end
    end
    
    p Post.all
    
[/code]


CC BY-SA 3.0
2015-01-13T03:05:57.523
4467
2015-01-13T10:29:31.010
2015-01-13T10:29:31.010
440
440
4466
answer


`Post['ruby'].name`のような書き方であれば、Rubyで実現できます。  
しかしながら、`Post.find('ruby').name`のようなメソッドチェインを用いるクラス設計の方がRubyらしい書き方だと考えています。

[code]

    class Post
      attr_reader :name
    
      def initialize(name)
        @name = name
      end
    
      def self.[](name)
        new(name)
      end
    end
    
    puts Post["ruby"].name #=> ruby
    
[/code]


CC BY-SA 3.0
2015-01-24T09:55:01.600
5201
2015-01-24T09:55:01.600
5456
4466
answer


「クラスに対して何らかの定義」ではありませんが、クラスとは別に、同じ名前のメソッドを定義することができます。

[code]

    class Person
        attr_accessor :name, :age
    end
    
    def Person(name)
        person = Person.new
        person.name = name
        person.age = 20
        person
    end
    
    p Person('yoshida').age  #=> 20
    
[/code]

クラスに対して定義したい場合は、（書き方は多少変わりますが） `self.call` を定義するという手もあります。

[code]

    class Person2
        attr_accessor :name, :age
        def self.call(name)
            person = new
            person.name = name
            person.age = 30
            person
        end
    end
    
    # 呼び出しにドットが必要
    p Person2.('yoshida').age  #=> 30
    
[/code]


CC BY-SA 3.0
2015-01-25T19:05:14.037
5269
2015-01-25T19:05:14.037
7794
4466
answer