7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Groovy]メソッドをクロージャに変換する

Last updated at Posted at 2014-04-16

#概要
Groovyでは、インスタンスメソッドをクロージャに変換する機能があります。
方法は簡単で、 ".&" という特殊な記号を使います。
例えば、hogeというオブジェクトのpiyoというメソッドをクロージャに変換するには以下のようにします。
def clos = hoge.&piyo
メソッドのpiyoにカッコ()は必要ありません。
これでpiyoメソッドがクロージャに変換されて、clos変数に格納されます。
ちなみに、clos変数の型(メソッドをクロージャに変換した結果の型)厳密に言うとClosure型ではなくて、MethodClosure型になります。
MethodClosureクラスはClosureクラスを継承しているので、Closureとして振る舞えます。

MethodClosureオブジェクト(今回の場合clos変数)は、元のhogeオブジェクトの参照を持っているので、hogeオブジェクトのプロパティを変更すれば、closの実行結果も変化させることができます。

使い方

ソースを見るのが手っ取り早い

class Test {
    def str = "string"
    def num = 1
    def hoge(){
        println "execute hoge()"
        "${str} from hoge method"
    }

    def piyo(Integer i) {
        println "execute piyo()"
        num + i
    }
}

// インスタンスの生成
def obj = new Test()

// インスタンスのメソッドをクロージャに変換
def clos = obj.&hoge
assert clos() == "string from hoge method"

// objインスタンスへの参照を持っているので、objのプロパティを変更すればすでにクロージャに変換しているものの実行結果も変化する。
obj.str = "change"
assert clos() == "change from hoge method"


// 引数が必要なメソッドをクロージャに変換。やり方は一緒。
def clos2 = obj.&piyo

// 実行時に引数を渡してあげればOK
assert clos2(100) == 101

#使い所
GrailsのInterceptionで利用するので、確かにあれば便利な機能だな、というのは解る。
けど自分で使うシチュエーションは思い浮かばない。。。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?