1. ホーム
  2. groovy

[解決済み] 名前付きパラメータ

2022-02-06 23:27:52

質問

メソッドを持っています。

def test(String a, String b) { }

で、これをダイナミックパラメータマップで呼び出したい。 いつも思うのですが

test(['1','2']); //valid call

然も

test([a:'1',b:'2']); //=> does not work

が、うまくいきません。そこで思い出したのが 散布図演算子 が、うまくいかない...。

上記のようなメソッドを、単一パラメータではなく、何らかのマップをパラメータとして呼び出す方法はありますか?

解決方法は?

もしかしたら見落としているかもしれませんが、Groovyには今、名前付きパラメータがないと思います。あるのは ディスカッション プロポーザル しかし、公式には何も知らない。

あなたの場合、地図が広がっていると思います かもしれません が役立ちますが、すべてのケースに当てはまるわけではありません。値を取得する際、マップの値が宣言された順番に従います。

def test(String a, String b) { "a=$a, b=$b" }
def test(Map m) { test m*.value }

assert test(a: "aa", b:"bb") == "a=aa, b=bb"
assert test(b: "aa", a:"bb") != "a=aa, b=bb" // should be false :-(
assert test(b: "ccc", a:"ddd") == "a=ddd, b=ccc" // should have worked :-(

クラスの場合は、次のようになります。 Groovyのas演算子 ?

@groovy.transform.CompileStatic
class Spread {
  class Person {
    String name
    BigDecimal height
  }

  def method(Person p) {
    "Name: ${p.name}, height: ${p.height}"
  }

  def method(Map m) { method m as Person }

  static main(String[] args) {
    assert new Spread().method(name: "John", height: 1.80) == 
      "Name: John, height: 1.80"
  }
}