(не) постоянство инициализаций VAR в функциях - PullRequest
1 голос
/ 09 мая 2020

Это продолжение моего предыдущего вопроса Построение пользовательских данных - ежедневно = нормально, еженедельно = не нормально .
Комментарии к принятому ответу предполагают, что состояние var внутри функции сохраняется во время последовательных вызовов этой функции.
Это оказалось правильным, потому что удаление var решило мою проблему.

Однако теперь у меня есть тестовый пример, который, кажется, доказывает обратное.
В приведенном ниже скрипте переменная b, похоже, НЕ сохраняется.

Функция f2() должна вызываться на каждом баре, чтобы оценить оператор if.
Это так, поскольку график y равен количеству баров.

Поскольку функция f2() также вызывает f1(), я ожидаю, что переменная b внутри f1() также увеличится на 1.
Окончательное значение b внутри f1() извлекается на последнем баре и сохраняется в z.

К моему удивлению, значение z после последнего бара оказалось равным 1.
Это означает, что либо:

  • var переменные не сохраняются внутри функция (опровергнута моим предыдущим вопросом )
  • вызовы вложенных функций имеют свой собственный контекст выполнения.

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

//@version=4
study("PlayGround")

var int y = 0
var int z = 0

f1() =>
    var int b = 0
    b := b + 1
    b

f2() =>
    f1()
    true

if true and f2()
    y := y + 1

if barstate.islast
    z := f1()

plot(y, title="y")
plot(z, title="z")

1 Ответ

1 голос
/ 09 мая 2020

Разные экземпляры вызова одной и той же функции, как вы и предполагали, поддерживают свой собственный контекст. Итак, в вашем случае вызов f1() изнутри f2() поддерживает другой контекст, чем тот, который сделан из блока if barstate.islast.

Это имеет как преимущества, так и недостатки. Это влечет за собой постоянную переменную (т. Е. Инициализированную с помощью var), локальную для области видимости функции, которая не может использоваться совместно, вызывая одну и ту же функцию из 2 разных мест в скрипте, но это позволяет многократно использовать функцию в контексте, таком как 3 последовательных f_print() вызовов.

Здесь мы обсуждаем постоянные переменные, но эта концепция распространяется на значения серии, созданные вызовами функций, и, следовательно, на значения, получаемые при использовании оператора обращения к истории для локальных переменных.

...