А разница? Если строки неизменяемые.
по ссылке, но так как они имутабельные - большой разницы нету
Ну, когда строка пару кило, тогда разница таки есть
Почти всё передаётся по ссылке, исключений по пальцам пересчитать (числовые примитивы, boolean, по-моему всё). Как и в джаве. А почему вы спрашиваете?
По ссылке, но они неизменяемые
Рассказывал начинающему и сам уже забыл
Не смущай народ. Kotlin, как и Java, не имеет pass by reference семантики. Всё передаётся по значению. Другое дело, что у нас нет в этих языках прямого доступа к самим объектам, только через ссылки. https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value http://www.javadude.com/articles/passbyvalue.htm Если бы была семантика передачи по ссылке, то можно было бы реализовать функцию swap: var1 = ...; var2 = ...; swap(var1, var2); Но такое нельзя сделать ни в Java, ни в Kotlin. в С++ можно, так как там есть передача по ссылке.
Ну это ты уже в дебри полез. За пределами С++ немного найдётся языков, где ссылка и указатель - разные вещи
Это не дебри, это основы. Вот простой тест, который я привёл с функцией swap. можно реализовать - есть передача по ссылке. Нельзя - нету.
Это даже скорее спор о терминах. Можно считать, что вообще всё и везде передаётся по значению, но иногда это значение - указатель. То, что ты подразумеваешь под ссылкой - синтаксический сахар над указателем.
Можно и системный блок называть процессором. Но это будет не корректно. :)
Я понимаю под ссылкой ровно то, что под ней понимается в языке C++, откуда и пошёл этот термин. Можно конечно под ним понимать что-то другое, но тогда тебя не поймут те, кто знаком с исходной терминологией.
Мы все-таки пишем на котлине, и под ссылкой подразумевается не то что в плюсах
На этот случай есть ссылка на википедию с описанием сути термина передача по ссылке.
Подразумевают обычно все-таки возможность менять входные значения, а не чего там в стек ложится
Ссылка — это одно и то же и там, и там. И это не совсем спор сугубо о терминологии, выше и правда верно привели пример практической разницы. В JVM (и Kotlin это унаследовал на всех платформах) фактически не pass by reference, а pass value by reference.
Ну так и не получится поменять переданный объект на что-то другое изнутри функции, так чтобы эти изменения снаружи было видно. Состояние объекта, если он изменяемый - да, но сам объект - нет.
Что на счёт byte[]? Почему-то резко захотел спросить
Нет такого в Котлин
Это массив, массив — это класс. Передаётся точно так же, как и другие — value by reference. Не by value, то бишь весь массив не копирутся при передаче.
Так же подумал. Вообще, странный вопрос я задал иначе бы была куча утечек памяти. Так как файлы хранят зачастую, как массив байт
На самом деле нет, это ByteArray, он класс с точки зрения котлин, но не с точки зрения JVM.
Да, pass value by reference максимально корректно))
Откуда утечек? :)
с точки зрения JVM - тоже класс, только с ним работают через другие инструкции абсолютно
Он такой очень особый класс.
Если бы файл в byte[] весом 5Gb передавался по значению... А не, как ссылка на значение то каждая такая передача разве бы не создавала дополнительные 5gb информации?
Я не уверен, что стек тянется на 5 гб, но даже если и тянется — это ж не утечка памяти, эта память вполне используется приложением.
Если я не ошибаюсь, там умный алокатор, он на ходу решает, куда что пихать. В зависимости от размера.
Ну мы тут говорим о передаче массива по значению, который вообще не про джаву. Так что джавовые аллокаторы тут применять смысла нет)
в си какой-нбиудь long[5000000] очень даже пойдет на стековую память. и переполнит ее к чертям
Я вооще исходо сказал, что это "по значению" "по ссылке" в плюсовом смысле тянуть не надо. Реально всегда действительно передается значение. Только это значениее почти всегда ссылка. Копирование значения происходит только для примитивов.
Обсуждают сегодня