2013-09-24 7 views
12

Я недавно читал о поведении GStringImpl s vs String s при использовании в коллекциях Groovy.Groovy GStringImpl и поведение String

Я понимаю, что причина этого оценивается как ложное ...

"${'test'}".equals("test") == false

обусловлено требованием симметрии .equals() контракта, однако мне было интересно, если бы была причина GStringImpl не мог просто оцените сразу String. Так что, когда я делаю что-то вроде этого ...

"${'someString'}"

Я не получить GStringImpl, я просто получить простой Java String назад, который я могу сразу же использовать в качестве ключа в карте, например, ,

Я знаю, что есть некоторые обходные пути, как

String s = "${'someString'}"

однако такие вещи, как это немного неудобно, и путаница между GStringImpl и String кажется большой «Гоча» для Groovy Newbees.

ответ

15

GStrings не оценивается сразу по строке из-за некоторых причин, в основном связанных с ленивой оценкой (что довольно хорошо для ведения журнала) и шаблонами. В Strings and GString вы можете найти хорошее объяснение:

GString может включать ленивые вычисления так что это не до ToString() метод вызывается, что GString оценивается. Эта ленивая оценка полезна для таких вещей, как ведение журнала, поскольку она позволяет вычислять строку , вызовы toString() для значений и конкатенацию разных строк, которые будут выполняться лениво, если вообще.

GString очень удобен, когда вы не хотите использовать движок шаблонов, или когда вам действительно нужна полная ленивая оценка GStrings. Когда какая-либо переменная , встроенная в GString, toString() вызывается на переменную , чтобы получить строковое представление, и она вставлена ​​в окончательную строку .

Поэтому:

GString и Струнный два различных класса, и, следовательно, использование GSTRING объектов в качестве ключей для объектов карты или сравнений с участием GSTRING объектов, может привести к неожиданным результатам в сочетании с Последовательностью объекты, поскольку GString и String не будут иметь одинаковый хэш-код, а будут равны. Автоматическое принуждение между двумя типами для сравнений или клавиш карты, поэтому иногда необходимо, чтобы явно вызывал toString() объекты GString.

Неожиданное преобразование в строку может привести к проблемам, когда код ожидает GString, как и для методов в классах groovy.sql.

+0

Ярмарка достаточно. Спасибо за объяснение. – rcgeorge23

+0

Можем ли мы динамически расширить класс GStringImpl для автоматического вызова .toString() при построении? –

Смежные вопросы