При добавлении значений в MAP, почему Scala требует дополнительный блок скобок, чтобы заставить этот оператор работать?Семантика семантики Scala
не компилируется:
vmap += (item.getName(), item.getString()) // compiler output: "found: String"
Однако это скомпилировать:
vmap += ((item.getName(), item.getString())) // note the second set of enclosures
ТИА
EDIT: VMAP определяется как
val vmap = new mutable.HashMap[String, String]()
Эпилог: Во время этого редактирования есть сообщения, в которых подробно изложены два возможных объяснения, оба из которых, как представляется, содержат в себе элементы истины. Какой из них действительно правильный? Я не мог сказать с какой-либо степенью уверенности ... Я всего лишь парень, который все еще изучает язык. При этом я изменил выбор ответа на основании чувства, что один ответ (по крайней мере, до некоторой степени) охвачен внутри другого - так что я выбрал большую картинку, так как я думаю, что это обеспечит более широкий смысл для кого-то другого в поисках ответа. По иронии судьбы, я пытался лучше понять, как смягчить некоторые тонкие нюансы языка, и то, что я понял, есть больше, чем я подозревал. Я не говорю, что это плохо - ведь (IMO) можно ожидать от любого языка, который является столь же гибким и сложным, но он уверен, что парень пропустит черно-белый мир Ассамблеи от времени до -time ...
Чтобы нарисовать это до конца, несколько наблюдений:
1) выбранный ответ содержит ссылку на сайт, полный изгибов мозга Scala (который я нашел чрезвычайно полезным в попытке понять некоторые вышеупомянутых кварков на языке.) Очень рекомендуется.
2) я наткнулся еще один интересный поворот - в то время как одной скобкой (пример выше) не работает, замените его на следующий, и он прекрасно работает ...
vmap += ("foo" -> "bar")
Который, вероятно, имеет что-то делать с подписями метода/функции, но это только догадка с моей стороны.
Чтобы убедиться, что я понимаю сердце материи (имея в виду, что я до сих пор относительно новичок в Scala) ... Я думаю, что вы показываете с f (и foo), так это потому, что они не имеют множественного метода подписи (ig, перегруженные), компилятор имеет широту (и будет) выводить кортеж при использовании только одной круглой скобки. Однако, поскольку g (и, следовательно, goo) имеет несколько сигнатур (и, следовательно, двусмысленность в отношении наилучшего соответствия), компилятор откажется от возможности ложного вывода - и, следовательно, требуется вторая скобка, поскольку она эффективно действует как литерал-кортеж. Это точно? – mjk
Почти. Вывод кортежа называется адаптированием arg, см. Редактирование, показывающее, что -Xlint скажет вам, когда это произойдет. Перед этим разрешается перегрузка.В этом случае существует только один метод, который может быть применен к двум аргументам, поэтому нет никакой двусмысленности как таковой (кроме наших голов). Люди называют это «Злой перегрузкой». Не все перегрузки создаются равными; это очень мягко. Некоторые плохо спроектированные перегрузки (или унаследованные от Java) заставляют вас сказать, я попросил f1 и получил f2, что должно быть ошибкой компилятора. –
Добавлен пример tupling, где требуется привязка для приложения, немного сложная, так как вывод принимает A как Tuple3. –