parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

про caller и $$name

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