Почему скаляк жалуется на метод + на String? - PullRequest
2 голосов
/ 18 сентября 2011

Учитывая следующий код Scala:

def stream(callback: (String, Array[Byte]) => Unit) {
    callback("application/json;charset=utf-8", Array(1))
    callback("application/xml;charset=utf-8", Array(1))
}

@Test
def whenStreaming_thenShouldSeeSameMessages() {
    var actualMessages = List.empty[(String, Array[Byte])]
    sut.stream {
        (contentType, payload) =>
            actualMessages += (contentType, payload)
    }

    expect(List("application/json;charset=utf-8", "application/xml;charset=utf-8")) {
        actualMessages
    }
}

Почему я получаю следующее сообщение об ошибке:

error: too many arguments for method +: (other: String)java.lang.String
actualMessages += (contentType, payload)

В частности, полезная нагрузка выделяется в IDEA и в командной строке,+ = выделено.Я действительно не понимаю это сообщение об ошибке.

1 Ответ

6 голосов
/ 18 сентября 2011

Метод создания нового списка с добавленным элементом на самом деле :+. Чтобы обновить список var с добавленной версией, вам нужно сделать,

actualMessages :+= (contentType, payload)

Или вы можете добавить,

actualMessages +:= (contentType, payload)
// or, equivalently,
// actualMessages ::= (contentType, payload)

(Для больших списков предварительное добавление на самом деле предпочтительнее, так как оно равно O (1) по сравнению с O (n) для добавления. Одна из стратегий заключается в использовании предварительного добавления для построения списка в обратном порядке, а затем в конце вызова List.reverse .)

С оператором +, который вы пытаетесь использовать, Scala считает, что вы хотите выполнить конкатенацию строк,

scala> List("hello") + " world"
res0: java.lang.String = List(hello) world

Это неудачный перенос с Java. Общая конкатенация строк реализована в Scala с использованием неявного преобразования, определенного в scala.Predef ,

implicit def any2stringadd (x: Any): StringAdd 

Происходит следующее: List не реализует метод +, поэтому компилятор ищет преобразование во что-то, что обеспечивает +, и находит any2stringadd. Вот как, например, true + " false" работает.

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