Присвойте значения кортежа отдельным переменным в Scala - PullRequest
0 голосов
/ 11 января 2020

Есть ли возможность присвоить значения кортежа отдельным переменным? Вот что я хочу сделать, но он выдает ошибку:


var a : Int = _
var b : Int = _

def init() {
   (a,b) = getTuple() // returns (Int, Int)
}

def someFunction = {    
    // use a here
}


def someOtherFunction = {    
    // use b here
}
Error: ';' expected but '=' found.
    (a, b) = getTuple()

Мне действительно нужно это делать ._1 и ._2 вещь?


val tuple = getTuple() // returns (Int, Int)
a = tuple._1
b = tuple._2

Спасибо за отвечая.

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Как вы можете видеть в Разделе 6.15 Назначения спецификации языка Scala, левая часть выражения присваивания должна быть либо пустым идентификатором:

foo = ???
// either an assignment to a local mutable `var` or syntactic sugar for:
foo_=(???)

доступ к члену:

foo.bar = ???
// syntactic sugar for:
foo.bar_=(???)

или вызов метода:

foo(bar) = ???
// syntactic sugar for:
foo.update(bar, ???)

Сопоставление с образцом доступно только для определений значений (см. Раздел 4.1 Объявления и определения значений ) и определения переменных (см. Раздел 4.2 Объявления и определения переменных ).

Итак, оба из следующих legal:

var (a, b) = getTuple()
val (a, b) = getTuple()

Между прочим, в вашем коде есть ряд вещей, не имеющих идиоматических выражений c:

  • Передавать пустой аргумент весьма необычно список для вызова метода. Обычно методы, которые не имеют параметров, не должны иметь списков параметров вместо пустого списка параметров. Единственным исключением являются методы, которые имеют побочные эффекты, где пустой список параметров служит своего рода «флагом предупреждения», но методы, которые имеют побочные эффекты, также не являются идиоматическими c. Итак, getTuple должен быть определен и назван так:
    def getTuple = ???
    getTuple
    
    вместо
    def getTuple() = ???
    getTuple()
    
  • С другой стороны, если метод имеет , имеет побочные эффекты, он не должен его нельзя назвать getTuple, поскольку это означает, что метод «получает» что-то, и нет никаких признаков того, что он также изменяет что-то.
  • В Scala методы получения и установки не являются называются getFoo и setFoo, а точнее foo и foo_=, поэтому метод скорее следует называть tuple.
  • Изменяемые переменные также не являются идиоматическими c, они должны скорее всего будет val с.
1 голос
/ 11 января 2020

Разрушение кортежа - это непрозрачный вызов unapply метода TupleN[T1, ..., Tn] объекта-компаньона, известного как объекта экстрактора . Как следует из документации, можно иметь только инициализацию переменной с объектом экстрактора, но не присваивание.

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

def getTuple = (1,2)

def main() = {
    val (a,b) = getTuple
    // use a,b
}

тот факт, что вы используете var, может быть признаком того, что у вас есть недостаток дизайна. Попробуйте изменить код или указать точную проблему, которую вы пытаетесь решить с помощью var, чтобы оправдать его использование (хотя то, что вы пытаетесь сделать с помощью экстрактора, все еще невозможно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...