2015-11-01 4 views
4

Начал играть в выходные дни с Котлином и пытается получить карты, работающие с операторами. Каким-то образом Котлин говорит мне, что я смущаю его с двусмысленностью.Kotlin Карта с помощью операторов

Вот код, который работает (синтаксически не так, как я хочу его):

var columns = sortedMapOf("a" to 1, "b" to 2) 
columns.plusAssign("c" to 3) 

А вот код, который просто не компилируется (но синтаксически ближе к тому, что я хочу)

var cs = sortedMapOf(1 to "a", 2 to "b") 
cs += Pair(3, "c") 

Какую короткую операционную магию/кастинг мне не хватает?

Заранее спасибо.

+0

Я понимаю вопрос, но я бы просто разрешил его с помощью 'columns.put (" c ", 3);' –

+0

JB, согласился - существует 100 способов заставить его работать (функционально). Дело в том, что Kotlin поддерживает оператор + = и что он должен работать, и я хочу использовать его, поскольку он читает математически, я хочу, чтобы мой код читался. Кроме того, я не получаю его на работу, означает, что я концептуально отсутствует что-то. – user1210708

+0

Я передал ваш вопрос на канале слабого канала. Давайте посмотрим, появится ли ответ ... –

ответ

7

Неоднозначность здесь потому, что Котлин может интерпретировать выражение cs += Pair(3, "c") либо операции, создавая новую карту из исходной карты и данной пары, назначаемых и эта карту обратно в переменную cs = cs.plus(Pair(3, "c")), или как операции мутагенных оригинальной карту cs.plusAssign(Pair(3, "c"))

Чтобы устранить эту ситуацию, следуйте девизу Kotlin - сделайте val, а не var!

Когда вы объявляете cs как val (non-mutable variable), его нельзя переназначить после его инициализации, поэтому единственная операция становится доступной здесь: plusAssign.

+0

Можете ли вы подтвердить, что нет возможности разрешить двусмысленность, если cs - это var, а не val? –

+0

Илья - спасибо - подтверждено и работает. Вау! Не совсем понимаю, что с этим делать (определенно, это изменение шаблона для всего, к чему я привык практически во всех других языках) ... но сейчас это будет выглядеть. Другое дело, почему он может определить cs.plusAssign(), но не cs. + = С тем же параметром Pair. Я бы, естественно, подумал, что он знает, что происходит и куда идет. – user1210708

+0

Извините, второй вопрос, на который вы уже ответили ... просто подумал вслух. – user1210708

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