Помимо plus
и minus
, являющихся операторами и, следовательно, упрощенными до +
и -
соответственно, я хотел бы поделиться примером, это может сделать более понятным, почему plusElement
или minusElement
также может иметь смысл использовать.По сути, это тот случай, когда вы не хотите, чтобы вызывались перегруженные операторные методы (например, plus(elements : Iterable<T>)
), что может быть в случае, когда вы имеете дело со списком списков.
Возможно, следующие примеры проясняют ситуацию.В примерах все присвоения переменных показывают тип, который они получили при вызове соответствующей функции, и содержат результат в комментарии в конце строки.Соглашение об окончании именования является следующим:
PlusT
показать вызовы plus(element : T)
PlusIterable
показать вызовы plus(elements : Iterable<T>)
PlusElementT
показать вызовы plusElement(element : T)
Образцы:
val someEntry = "some entry"
val listOfSomeEntry = listOf(someEntry)
val los : List<String> = listOf("listOfString")
val lsPlusT : List<String> = los.plus(someEntry) // [listOfString, some entry]
val lsPlusIterable1 : List<String> = los.plus(listOfSomeEntry) // [listOfString, some entry]
val lsPlusIterable2 : List<Any> = los.plus(listOf(listOfSomeEntry)) // [listOfString, [some entry]]
val lsPlusElementT1 : List<String> = los.plusElement(someEntry) // [listOfString, some entry]
val lsPlusElementT2 : List<Any> = los.plusElement(listOfSomeEntry) // [listOfString, [some entry]]
val lol : List<List<String>> = listOf(listOf("listOfList"))
// the following is basically not really correct as we are now dealing with a list of lists of strings, but it shows that llPlusT and llPlusIterable lead to the same (in this case probably wrong) result..
val llPlusT : List<Any> = lol.plus(someEntry) // [[listOfList], some entry]
val llPlusIterable : List<Any> = lol.plus(listOfSomeEntry) // [[listOfList], some entry]
val llPlusIterable2 : List<List<String>> = lol.plus(listOf(listOfSomeEntry)) // [[listOfList], [some entry]]
val llPlusElement1 : List<Any> = lol.plusElement(someEntry) // [[listOfList], some entry]
val llPlusElement2 : List<List<String>> = lol.plusElement(listOfSomeEntry) // [[listOfList], [some entry]]
Как вы можете видеть при использовании +
может использоваться перегруженный вариант plus(elements : Iterable<T>)
, который, вероятно, будетимеет смысл в большинстве случаев, но может не иметь смысла в некоторых других, например (в большинстве случаев) при работе со списком списков.Вместо того, чтобы заставлять +
добавлять список списков с помощью + listOf(anotherList)
, вы можете использовать plusElement
(plusElement(anotherList)
) или, если вы уверены, что хотите добавить только один элемент, вы можете захотетьопустить plus
в пользу plusElement
(вероятно, очень редкий и очень особый вариант использования ... это будет отражено в варианте llPlusElement1
).
Наконец, plusElement
или minusElement
из наименования проясните, что то, что вы передаете, отражает 1 единственный элемент списка, тогда как +
оставляет это в основном открытым ... (однако вы должны увидеть это из контекста, который со списком списка, вероятно, не таков).очистить в любом случае ;-)).И отказ от ответственности в конце: это не должно означать, что вы должны использовать список списков, но на случай, если вы найдете что-то подобное, у вас есть plus/minusElement
под рукой; -)