Раньше, когда у меня возникали проблемы с оценкой вещей, это обычно происходило, когда я не соответствовал шаблону, требуемому функцией.Например,
f[x_Integers]:= x
, который не будет ничего соответствовать.Вместо этого я имел в виду
f[x_Integer]:=x
В вашем случае, однако, у вас нет шаблона для сопоставления: timeConsumingOperation[]
.
Ваша проблема, скорее всего, связана с тем, когда timeConsumingOperation
определено относительно myDataset
.В коде, который вы разместили выше, timeConsumingOperation
определяется после myDataset
.Итак, при первом запуске (или сразу после очистки глобальных переменных) вы получите именно тот результат, который вы описываете, потому что timeConsumingOperation
не определяется при запуске кода для myDataset
.
Теперь SetDelayed
(:=
) автоматически вызывает пересчет переменной всякий раз, когда она используется, и, поскольку вам не требуется передавать какие-либо параметры, квадратные скобки не нужны.Важным моментом здесь является то, что timeConsumingOperation
может быть объявлено, как написано, до myDataset
, потому что SetDelayed
приведет к тому, что он не будет выполнен, пока не будет использован.
В общем, ваша методология кэширования выглядит именно так, как я бы поступил.