Akom
Akom

Reputation: 1631

How to pass parameters to groovy with() method

I want to invoke an externally provided closure in the context of some script, but I'd like it to be able to access an object scoped to the method from which the closure is being invoked:

def method1(Map config) {
  ...
  with config.some_closure //here I'd like to pass the config map as a param.
}

//now invoke:
method1 {
  some_value: 1,
  some_closure: { def param1 ->
     //access param here, eg:
     param1.some_value = 2
  }
}

My current workaround is to assign my object to a script-scoped variable so that the provided closure can access it:

globalConfig = null

def method1(Map config) {
  globalConfig = config
  ...
  with config.some_closure //here I'd like to pass the config map as a param.
}

//now invoke:
method1 {
  some_value: 1,
  some_closure: { 
     //access global here, eg:
     globalConfig.some_value = 2
  }
}

Is there a better way?

Upvotes: 0

Views: 3282

Answers (2)

Luis Muñiz
Luis Muñiz

Reputation: 4811

I think currying is what you are looking for:

def method1(Map config) {

  with config.some_closure.curry(config) // this is a new closure taking no arguments, where param1 has been fixed.
}

//now invoke:
method1 ([
  some_value: 1,
  some_closure: { def param1 ->
     //access param here, eg:
     param1.some_value = 2
  }
])

Upvotes: 1

Akom
Akom

Reputation: 1631

I think that using delegate is a valid alternative to with() that permits parameter passing:

def method1(Map config) {
  ...
  config.some_closure.delegate = this // retain access to this object's methods
  config.some_closure(config) //pass config explicitly
}

//now invoke:
method1 {
  some_value: 1,
  some_closure: { def param1 ->
     //access param here, eg:
     param1.some_value = 2
  }
}

Upvotes: 0

Related Questions