Запустить функцию с несколькими значениями - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть функция, подобная следующей

def runTestsInDocker(arg) {
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoPro
            go ${arg}                        
            """
        }
    }

Когда у меня только 1 параметр, он работает как положено. Теперь я хочу добавить новые параметры, чтобы я мог сделать что-то вроде этого

def runTestsInDocker(arg,arg2,arg3) {
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoPro

            go ${arg}  
           go ${arg1}
           go ${arg2}
            """
        }
    }

Но здесь у меня две проблемы

1.Что произойдет, если мне нужно будет передать только один параметр?

Если мне нужно передать 10 параметров, у меня будет 10 аргументов?

Есть ли лучший способ справиться с этим?

обновление , допустим, мне нужно вызвать функцию с 1 параметром

   def runTestsInDocker(Map<String,String> params) {
        measureDuration(script: this, measurementName: 'build') {
            executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
                sh """
                mkdir -p /go/src/github.com/ftr/myGoPro

                go ${params.get('arg')}  

                """
            }
        }

и другую функцию

   def runTestsInDocker(Map<String,String> params) {
        measureDuration(script: this, measurementName: 'build') {
            executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
                sh """
                mkdir -p /go/src/github.com/ftr/myGoPro

                go ${params.get('arg')}  
                go ${params.get('arg1')} 
                """
            }
        }

Не знаюНе знаю заранее, сколько параметров мне нужно будет использовать, так как я могу сделать это динамически?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Если посмотреть на целевой пример, это выглядит как идеальный случай для varargs .

def runTestsInDocker(String... args) {
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage, dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoPro
            go ${args.join('\ngo ')}
            """
        }
    }
}

Если вы действительно хотите передавать параметры только в определенной позиции, эта сигнатура метода позволяета также.

runTestsInDocker(null,'foo',null,'bar')
// OR
def args = []
args[2] = 'foo'
args[5] = 'bar'
runTestsInDocker(args as String[])

Если по какой-то причине вам действительно нужны параметры с разными именами и семантикой, я бы посмотрел на следующее:

  • Значения по умолчанию, например runTestsInDocker(String arg = null, String arg1 = null, String arg2 = null)
  • Параметр карты, например runTestsInDocker(Map map)
  • Параметр POGO, например runTestsInDocker(MyPogo args).По сравнению с картой это обеспечивает проверку типов, и очень просто создать POGO только с теми значениями, которые вам нужны.
0 голосов
/ 04 декабря 2018

Вы можете отправить Map в метод, чтобы вызвать несколько параметров

def runTestsInDocker( Map<String,String> params) {

и вызвать его с помощью Map:

def params = [ arg:'value', arg1:'value1' ];
runTestsInDocker(params);

Внутри метода итерация покарта динамически как:

params.each{ k, v -> go ${v} }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...