Почему оператор «+» внутри функций не модифицирует * def сделанные переменные? - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь обработать список json-ов, полученный в ответ от API.

[
  {
    "originalEstimate": "16h",
    "remainingEstimate": "9h",
    "timeSpent": "7h"
  },
  {
    "originalEstimate": "64h",
    "remainingEstimate": "63h",
    "timeSpent": "1h"
  }
]

Я должен суммировать поля, и я придумал код для него, но похоже, что он не изменяет переменную mySum.

Для этого примера я просто использовал 'originalEstimate'.

Я попытался добавить элементы вручную, и это работает. Пример: (parseFloat (getNum (json [0] .originalEstimate))) == 16,0

getNum - это функция, которая вырезает 'h' из строки.

Код выглядит так:

    * def getNum = function (a)  {return a.substring(0,a.length()-1)}
* text raw =
    """
  [
    {
      "originalEstimate": "16h",
      "remainingEstimate": "9h",
      "timeSpent": "7h"
    },
    {
      "originalEstimate": "64h",
      "remainingEstimate": "63h",
      "timeSpent": "1h"
    }
  ]
  """
    * json json = raw
    * def mySum = 0
    * def fn = function(x) {mySum = mySum + (parseFloat(getNum(x.originalEstimate)))}
    * eval karate.forEach(json,fn)
    * print mySum

Я ожидал увидеть 80.0 в качестве оригинальной суммы, но получил 0. Кроме того, он работает отлично, просто не изменяет mySum

1 Ответ

2 голосов
/ 30 апреля 2019

Да, когда вы объявляете функцию, переменные блокируются до значения на момент объявления функции. Решение использовать karate.get() и karate.set():

* def getNum = function(x){ return x.substring(0, x.length() - 1) }
* def sum = 0
* def fun = function(x){ var temp = karate.get('sum') + parseFloat(getNum(x.originalEstimate)); karate.set('sum', temp) }
* def response =
"""
[
  {
    "originalEstimate": "16h",
    "remainingEstimate": "9h",
    "timeSpent": "7h"
  },
  {
    "originalEstimate": "64h",
    "remainingEstimate": "63h",
    "timeSpent": "1h"
  }
]
"""
* eval karate.forEach(response, fun)
* print sum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...