

rubyでチェーンメソッドが使える関数の作り方を教えて下さい。

[code]

    "string".hoge()
    
[/code]

hogeをつくりたい

[code]

    def hoge(){
    }
    
[/code]


CC BY-SA 3.0
2015-01-24T19:45:28.857
5226
2016-03-29T21:06:13.707
5855
question
ruby
rubyのチェーンメソッド関数の作り方


クラスにメソッドを付け加えたいときは、[モンキーパッチ](http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%81)
をします。

[code]

    class String
      def hoge
        # メソッドの中身
      end
    end
    
    "string".hoge
    
[/code]

チェーンメソッドにするのは簡単です。メソッドが `self` か 同じクラスのオブジェクトを返すようにします。

[code]

    class Foo
      def m1
        puts "hi"
        self
      end
    
      def m2
        puts "bye"
        self
      end
    end
    
    f = Foo.new.m2.m2
    f.m1.m2.m2.m1
    
    # 出力
    # bye
    # bye
    # hi
    # bye
    # bye
    # hi
    
[/code]

チェーンメソッドではないですが、初期化の際にコンパクトな書き方を可能にするために、ブロックを渡すようにすることもできます。この場合ブロックを新しいオブジェクト内で実行させるために、[instance_eval](http://docs.ruby-
lang.org/ja/2.1.0/method/BasicObject/i/instance_eval.html)というメソッドを使います。

[code]

    class Foo
      def initialize(&block)
        instance_eval(&block)
      end
    
      def m1
        puts "hi"
        self
      end
    
      def m2
        puts "bye"
        self
      end
    end
    
    f = Foo.new do
      m1()
      m2()
    end
    
    # 出力
    # hi
    # bye
    
[/code]


CC BY-SA 3.0
2015-01-24T20:11:39.537
5227
2015-01-24T23:19:59.870
2015-01-24T23:19:59.870
4978
7745
5226
answer


チェーンメソッドではなくメソッドチェーン(チェイン)です。メソッドのチェインです。

メソッドチェインは、「前のメソッドの戻り値をレシーバとしたメソッド呼び出しができる構文」に過ぎません。

[code]

    str = " abc ".strip # => " abc "
    str.upcase # => "ABC"
    #これをつなげてこうかける
    " abc ".stip.upcase #=> "ABC"
    #冗長な括弧を付けるとこう
    (" abc ".stip).upcase #=> "ABC"
    
[/code]

呼び出す側の話ですので、メソッド定義(呼び出される側)でなにか特別なことをする必要はありません。メソッドチェインで別のメソッドが呼ばれることを前提にしているなら、そのメソッドを受け取れるクラスのオブジェクトを戻り値として返すだけです。

「selfか同じクラスのオブジェクトを返さないといけない」という回答がついていますが誤りです。上記の通り単なるメソッド呼び出しの構文にすぎないので、どのようなクラスのオブジェクトを返しても、そのオブジェクトが受け取れるメソッドなら続けて書けます

[code]

    12345.to_s.length #=> 5
    
[/code]


CC BY-SA 3.0
2016-03-29T21:06:13.707
23601
2016-03-29T21:06:13.707
5793
5226
answer