Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Watcher 29.11.2019 17:56
*Насколько я вообще помню по прошествию лет (так, что могу ошибиться)caller - это такой искусственный "объект", "телепортирующий", а точнее дающий "портал" в "предыдущий" контекст кода. Слово "предыдущий" понимается не контексте последовательного выполнения кода, а в контексте инкапсуляции - т.е. погружения в изолированные контексты других методов (или операторов со скобками {}). Это намеренная "форточка" на случай необходимости доступа к локальным переменным разных изолированных контекстов. В целом, использования таких практик стоит избегать, но когда прям вот надо - то для этого оно и существует. Так реализуется в Парсере схема, известная, как "замыкания". Таким образом, @method1[][a;b] # а и b локальные переменные метода1 $a[1] $b[1] ^method2[] # вызов этого метода поменяет значение в нашей локальной $a @method2[][a;b] # локальные переменные метода2 $a[1] $b[1] $caller.a[2] # изменить значение $a в пространстве метода1 # А если у нас динамический выбор имени переменной? Например: $var[b] $caller.$var[3] # сделает в method1 -> $b[3] # А если значение тоже динамическое? $var[a] $val[2] $caller.$var[$val] # сделает в метод method1 -> $a[2] # А вот дальше я не уверен за механику "разыменовывания" но она либо/либо # по идее, если мы напишем $var[a] $val[b] $caller.$var[$$val] # то оно превратится в method1 -> $a[$b] то есть в работу с обеими локальными переменными $a и $b метода1 т.к. $var = b, $$var = $b # Но это не точно(!) :) тут я во-первых подзабыл, во-вторых проверять лень # в-третьих не вникал даже в приведенные в треде примеры, поэтому второе "либо" # это тоже самое $$var - но разыменующееся в $b все же на стороне метода2, # или только потом все это исполнится в контексте метода1 Пусть знатоки поправят.А с $$name - всё довольно банально