В проекции OGNL почему #this ведет себя по-разному при доступе к свойству и вызове лямбды? - PullRequest
0 голосов
/ 29 января 2020

Я новичок в OGNL, поэтому извиняюсь, если я иду по проторенному пути или моя терминология неверна.

Я изо всех сил пытаюсь понять, как # это должно вести себя при проецировании по списку. Кажется, он ведет себя по-разному в зависимости от того, как он используется. Я ожидаю, что следующее выражение вернет [bar, bar, bar], но оно вернет [null, null, bar]?

Root:

#{ “pet”: “dog” }

Выражение:

#testMap = #{ "foo": "bar" },
#testLookup = :[ #testMap[#this] ],
{ "foo" }.{ { #testMap[#this], #testMap.get(#this), #testLookup(#this) } }[0]

Если я добавить оператор печати в проекцию:

#testMap = #{ "foo": "bar" },
#testLookup = :[ #testMap[#this] ],
{ "foo" }.{ @java.lang.System@out.println(#this), { #testMap[#this], #testMap.get(#this), #testLookup(#this) } }[0]

Он печатает root:

{ pet=dog }

Если я добавлю присвоение к локальной переменной, он вернет [bar, bar, bar], как и ожидалось:

#testMap = #{ "foo": "bar" },
#testLookup = :[ #testMap[#this] ],
{ "foo" }.{ #temp = #this, { #testMap[#temp], #testMap.get(#temp), #testLookup(#temp) } }[0]

Я прочитал язык spe c и не могу понять, почему он ведёт себя так: # Похоже, что это вычисляет текущий элемент при вызове лямбды и root при доступе свойство или вызов метода. Я также отмечаю, что в лямбде он ведет себя как положено. Я надеюсь, что кто-то с большим опытом работы с OGNL сможет объяснить.

Я использую OGNL 3.2.12 из простого тестового набора, который оценивает root (с пустым root) и затем использует root при оценке выражения.

...