| Новости | 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 - всё довольно банально