1 / 1 / 1
Регистрация: 19.07.2017
Сообщений: 13
|
|||||||||||
1 | |||||||||||
Замыкание, или аргументы в функциях22.07.2020, 23:00. Показов 2770. Ответов 5
1)В функции попадают аргументы по значению или по ссылке? 2)delta - локальная переменная, или глобальная? local - нужен? 3) в return function (x) аргументы залетают откуда? Есть код, где непонятно что за переменные и где они существуют:
0
|
22.07.2020, 23:00 | |
Ответы с готовыми решениями:
5
Аргументы object sender и EventArgs e в функциях Короткое замыкание или нет? Невероятные приключения Qt или ошибка в элементарных функциях Как в JavaScript передаются параметры в функциях? По ссылке или по значению. |
23.07.2020, 06:38 | 2 | |||||
Замыкание - это функция, возвращающая функцию с сохраненными локальными переменными порождающей ф-ции.
1 - таблицы и пользовательские типы попадают по ссылке, остальные типы - по значению 2 - локальная, поскольку это - аргумент ф-ции. Все аргументы ф-ций - локальны, local не нужен. 3 - в данном случае: c=prov(math.sin) -- создаем ф-цию с именем "с" и сохраненной внутри ф-цией синуса, второй параметр опущен, поэтому по умолчанию равен 1e-4 print(math.cos(5.2),c(5.2)) -- вызываем созданную ф-цию "c" с параметром 5.2 -- именно он "залетает" в x. Вторая ф-ция создает некую "хранилку данных" - причем насоздавать таких хранилок можно сколько угодно... Что конкретно в ней делается, разбираться желания нет. что-то типа: ema1 = cached_EMA() -- создаем ema2 = cached_EMA() ema1( a, b, c, d ) -- вызываем ema2( e, f, g, h ) ps: спасибо за вопрос, мне тут в голову пришло, что замыкания можно использовать для ограниченного ооп. Что-то типа такого:
ну то есть вызывать то нужно как-то так: n1 = ema1( a, b, c, d ) n2 = ema2( e, f, g, h ) В зависимости от того, что будет там внутри накапливаться, значения n1 и n2 будут разными. А.... "Индикатор EMA (Exponential Moving Average)" -- ну значит это он и есть... Скользящее среднее.
1
|
1 / 1 / 1
Регистрация: 19.07.2017
Сообщений: 13
|
|
23.07.2020, 09:45 [ТС] | 3 |
1) В первом блоке кода сохранение идет в prov (переменная delta), зачем нужна вызывающая функция? В ней же производится только вычисление?
2)Во втором блоке кода возвращающая функция принимает четыре аргумента. И пересохраняет в локальные переменные в возвращаемой функции. Это делается что бы уничтожить их, как только функция глобальная завершит свое действие? К cached_EMA() идет циклический вызов. И к таблице cache обращается повторно. Т.е. она не уничтожается? 3) Зачем хранить локальные переменные вызываемой функции, вместо того. Что бы их хранить в глобальных переменных, в чем преимущество? 4) Можно пример функции (й). Которая записывает или удаляет значения в таблицу ключей и значений, другая считывает.
0
|
23.07.2020, 10:41 | 4 | |||||
1 - Вы видимо не поняли. Функция prov - создающая. Ее задача - создать некую функцию, при этом настроив для нее две как бы это сказать... персональные переменные - f и delta. В f записывается ф-ция, в delta - начальное значение. Затем при каждом вызове созданной ф-ции идет приращение delta на 1e-4 и расчет f(x+delta)-f(x))/delta -- где f - переданная в prov ф-ция.
Таких "считалок" вы можете насоздавать сколько угодно - и для каждой из них f,delta установить своими. В этом и суть. 2 - по указанной выше причине они не уничтожаются - а становятся своими собственными для созданной ф-ции. 3 - В том, что ф-ций можно насоздавать сколько угодно. Замыкание в какой-то мере является классом с одним методом. 4 - для этого не нужны ф-ции, но в принципе можно:
1
|
1 / 1 / 1
Регистрация: 19.07.2017
Сообщений: 13
|
|
23.07.2020, 12:24 [ТС] | 5 |
Т.е. получается, возвращающая функция нужна для того. Что бы получить доступ к аргументам простейших типов данных? Как передаваемые для вызываемого метода, так и в функциях, которые являются аргументами. И они идут в порядке очереди, в котором встречаются.
Так же возвращающая функция фактически держит в памяти переменные. Что бы не создавать непрерывно новые. И не забивать память? И что бы не изменять аргументы, которые прилетели в функцию? Добавлено через 12 минут В вашем коде таблица прилетает как аргумент. В своем примере таблица является частью функции. И там хранится. Вот я и пытаюсь понять - какой в этом смысл? Мне нужен доступ к этой таблице, как на запись, так и получение данных. И почему то нет глобальных таблиц, т.е как бы без функции нельзя их создать.
0
|
23.07.2020, 13:23 | 6 |
Вообще-то это вы должны писать поступающие значения котировок в этот индикатор - и зачем вам нужен доступ к локальной таблице, тем более на запись - я представить не могу от слова вообще...
0
|
23.07.2020, 13:23 | |
23.07.2020, 13:23 | |
Помогаю со студенческими работами здесь
6
Как использовать одну переменную в двух или больше функциях? Закрытые поля класса или аргументы метода? Как проверить указаны какие-то аргументы класу или нет? Запись по ссылке или указателю в аргументы функции через макрос va_arg Как правильно называть переменные в заголовке функции (параметры или аргументы)? Можно ли отсылаться из одной функции к какой-то определенной из нескольких? Или вписывать в аргументы формулу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |