2015-05-11 3 views
0

У меня есть массив элементов типа Any. Я использую некоторые значения для конкатенации их в строку в одной строке в декларации карты:Разница между конкатенацией любых в карте по сравнению с функцией

val mapRequest = Map(
    "the_geom" -> "CDB_LatLng(" + row(2).toString() + ", " + row(3).toString() + ")" 
) 

Это дает мне эту ошибку, которую я не понимаю:

[error] /path/to/file/Signal.scala:92: type mismatch; 
[error] found : String 
[error] required: (?, ?) 

Когда я положил, что конкатенации внутри функции и использовать его как это:

val mapRequest = Map(
    "the_geom" -> Utils.getGeom(row(2), row(3)) 
) 

Если функция getGeom определяется следующим образом:

def getGeom(lat:Any, lon:Any) : String = { 
    return "CDB_LatLng(" + lat.toString() + ", " + lon.toString() + ")" 
} 

Все работает.

Можете ли вы объяснить, что отличается от того, что такое выражение конкатенации внутри объявления карты и объявление функции?

ответ

0

Это будет работать:

Map(
    "the_geom" -> ("CDB_LatLng(" + row(2).toString() + ", " + row(3).toString() + ")") 
) 

Вы пытаетесь создать экземпляр карты с кортежем "the_geom" -> "CDB_LatLng(" сцепленного с некоторой строкой, из-синтетической функции +, которые будут считать, что обе стороны представлены в виде строки, если не указано иное. Область действия getGeom предоставляет эту область для вас, сохраняя скобки. Если вы завершаете конкатенацию String в круглых скобках, значение внутри будет оцениваться до операции tuple. В этом случае просто прочитайте его слева направо, и это имеет смысл.

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