2012-03-05 7 views
1
のGroovyのすべてで

は、偶数実行時に既存のクラス内の既存のメソッドをオーバーライドすることができますGroovyではGroovyのオーバーライド「または」を

assert 1.getClass() == Integer 

オブジェクトである

Integer.metaClass.or = { right -> println "$delegate or $right" } 
これまでのところ

1.or("hello") // prints: 1 or hello 
1 | "hello" // prints: 1 or hello 

とても良い|()

今、私たちはパイプを使用して任意の数に電話またはオペレータできます。何も起こらないのはなぜ

  • :それでは、整数

    2.or(3) // nothing happens 
    2 | 3 // nothing happens 
    

    またはに整数を試してみましょうこれは私の質問に私たちをリード?

  • これは最適化のバグですか?
  • どのようにしてどのタイプにしても機能させるには?

答えて

1

これはおそらく、より汎用的なオブジェクトバージョンではなく、整数をとる既存のorメソッドを選択している可能性があります。しかし、現時点では

コンピュータで
Integer.metaClass.or = { Integer right -> println "$delegate or $right" } 

ないので、これを検証することはできません:

あなたがしなければ、それは動作します -/

+0

をちょうどそれだそれ、それは速かった、ありがとう! –

+0

カテゴリを使用せずに、オーバーロードされたすべてのカスタムまたはカスタムをオーバーライドする方法を知っていますか? –

+0

'or'メソッドは3つの場所で利用できるようです。 [Boolean](https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L10439)に1回、[Number](https ://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L9405)、一度[BitSet](https://github.com/ groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L9472)を参照してください。 1つのメソッドでオーバーライドするには、3つの型付きクロージャのすべてを1つのメソッドに委譲する必要があります。 –

関連する問題