openlang

Зачем заключать переменную слева от присваивания в скобки?

Не знаю, относится ли это к Groovy или Java, но мне встречались такие присваивания:


String savedText = ""
...
(savedText) = readText(setting);

скобки вокруг savedText что-нибудь делают или лишь должны улучшать читаемость?

Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    И Java, и Groovy допускают такую "штуку" (то есть синтаксис корректен). В Groovy эта запись поддерживает составное присваивание (хотя здесь присваивается только один элемент...)

    
    String left, middle, right
    (left, middle, right) = ["4", "5", "6"]

    В Java составного присваивания, однако, нет. Но Java Language Specifications 15.26.1 (https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.26.1) допускает сколько угодно окружающих скобок:

    Когда выражение левого операнда является обращением к полю e.f (§15.11), возможно окружённым любым количеством пар скобок, то:

    Важно лишь, чтобы после полного вычисления получалось обращение к полю (или элементу массива).

    скобки вокруг savedText что-нибудь делают

    Нет.

    или лишь должны улучшать читаемость?

    На мой взгляд, читать становится труднее. Впрочем, единый стиль важнее. Возможно, хотели привести простые присваивания к стилю составных?

    
    String single
    (single) = "456"
    
    String left, middle, right
    (left, middle, right) = ["4", "5", "6"]
    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Groovy

    Показанный синтаксис представляет собой разновидность деструктуризации.

    1.2.1. Multiple assignment (https://groovy-lang.org/semantics.html#_multiple_assignment)

    В Groovy есть множественное присваивание, позволяющее нескольким переменным получать значения одновременно, например:

    def (a, b, c) = [10, 20, 'foo'] 
    assert a == 10 && b == 20 && c == 'foo'

    При желании в объявлении можно указать типы:

    def (int i, String j) = [10, 'foo'] 
    assert i == 10 && j == 'foo'

    Это работает не только при объявлении, но и с переменными, объявленными ранее:

    def nums = [1, 3, 5] 
    def a, b, c 
    (a, b, c) = nums 
    assert a == 1 && b == 3 && c == 5

    Синтаксис подходит и для массивов, и для списков, и для методов, возвращающих любой из этих вариантов:

    def (_, month, year) = "18th June 2009".split() 
    assert "In $month of $year" == 'In June of 2009'

    Помните, что деструктуризация происходит даже тогда, когда внутри скобок только одна переменная для присваивания. Ей достаётся первый элемент деструктурируемого значения.

    
    def (slot) = [3, 6, 7]
    assert slot == 3

    Следующий пример выбрасывает исключение, поскольку деструктурировать здесь нечего

    
    def (slot) = 3

    Java

    Сейчас это допустимая запись без особого смысла

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Как случайно выбирать варианты enum в GDScript на Godot 3.3, не перечисляя их?

    Вот объявление enum, которое я использую в GDScript: Хочу случайно выбирать вариант enum, не перечисляя все возможные вариант…

    Ответы 2Последняя активность gdscript
  2. Синтаксис остатка в Nim

    Как в Nim записать операцию взятия остатка? cell % 7 == 0 выдаёт undeclared identifier: '%' Ни поиск в Google, ни просмотр SO…

    Ответы 2Последняя активность nim
  3. Возврат результата из функции APL

    Как сделать так, чтобы моя функция возвращала значение после завершения выполнения? Например, у меня есть: ROUTINE N ? N ⍴ 12…

    Ответы 2Последняя активность apl