Придирка к задаче про рост: вероятность одноточечного множества может быть и ненулевой, это зависит от распределения. Реально рост распределен более-менее нормально, но в формулировке это не сказано.
Потому что это учебники про язык, а не про платформу.
На самом деле учебники, несомненно, "так делают", т.е. различают объекты и ссылки (включая учебники начального уровня, например, Head First).
Более того, это в явном виде написано по ссылке выше ("… в сообществах Java и Visual Basic ту же семантику часто описывают как «вызов по значению, где „значением“ является ссылка на объект»...").
Изменяемость типа с этими вопросами не связана, см. другой мой коммент. К инстансу ArrayList указанные аргументы применимы в равной степени.
std::swap именно меняет ссылки, а не изменяет каждое из значений. В приведенном мной коде, кстати, int. И это работает именно потому, что передача идет по ссылке, а не потому, что int мутабелен.
Судя по тому, что вы написали выше ("Передача по ссылке в C++ даёт вам те же возможности, что и обычная передача для больгинства типов в Java."), у вас была содержательная, а не терминологическая ошибка в картине мира.
А что до терминологии, то она вполне стандартна, и "считать, что в Java всё и всегда передаётся по ссылке" нельзя.
Передайте в вашу функцию swap в Java вместо String (который менять нельзя) ArrayList (который менять таки можно) — и ваш swap преотлично реализуется…
Промутировать аргументы — это не то же самое, что поменять их местами. Имелась в виду тождественость ссылок после вызова swap, а не равенство по equals, разумеется.
А вы специально в примере используете не такие строки, как в Java?
Не понял, что вы имеете в виду. Приведенный (невозможный) код написан на Java.
Дописывать и вообще разбирать ваш код мне неудобно и недосуг, извините. Вот (найденный) код с использованием std::swap:
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a;
cin >> b;
swap(a, b);
cout << a;
cout << b;
return(0);
}
В Java так сделать нельзя, что с int, что с Integer.
Повторюсь, если вы думаете, что в Java агрументы передаются по ссылке, вы заблуждаетесь, причем заблуждаетесь капитально. Рекомендую погуглить что-то вроде "is Java pass-by-value". Например, на Stackoverflow это подробно разобрано. Ну или вот (часть 8.4.1 спецификации Java 8):
When the method or constructor is invoked (§15.12), the values of the actual argument expressions initialize newly created parameter variables...
Всё передается по значению, но для ссылочных типов значение является ссылкой. Это не то же самое, что передача по ссылке. Например, нельзя написать функцию, которая меняет местами аргументы (в отличие от, скажем, C++, где есть передача по ссылке).
Конечно, я не предлагаю заводить фабричный метод для создания временного интервала из граммов. Важно не путать разные величины, а вот в каких единицах задано значение — неважно. Что-то типа TimeDelta::fromSeconds, TimeDelta::fromMonths и так далее, возвращающие один и тот же тип (с типом для массы не совместимый). Нетрудно придумать единообразное внутреннее представление, с которым перегрузка будет работать единообразно. Иначе говоря, 24 часа и сутки — это ровно одно и то же. А вот какая польза от отдельных типов для интервала в секундах и интервала в минутах — неясно.
Тот случай, когда пара комментариев довольно много прояснила.
Тут речь о противоположном: коллеге хочется не увидеть тип, который не прописан, а скрыть тип, который прописан.
github.com/arbox/machine-learning-with-ruby — ну это, конечно, по сравнению с тем, что есть в Python, баловство.
Придирка к задаче про рост: вероятность одноточечного множества может быть и ненулевой, это зависит от распределения. Реально рост распределен более-менее нормально, но в формулировке это не сказано.
Уберите, пожалуйста, из плейлиста скрытый ролик (номер шесть).
На самом деле учебники, несомненно, "так делают", т.е. различают объекты и ссылки (включая учебники начального уровня, например, Head First).
Более того, это в явном виде написано по ссылке выше ("… в сообществах Java и Visual Basic ту же семантику часто описывают как «вызов по значению, где „значением“ является ссылка на объект»...").
Уверен, что вы кругом неправы в основах, но разговор окончен.
Мне даже немного неловко это писать. Но как это нельзя? А что
==
делает?На
sdt:swap
вам уже указали и примеры привели. Честно говоря, мне кажется, всего этого должно быть достаточно, чтобы увидеть свою неправоту.Мутабельность
std::string
при этом ни при чем, потому что она не используется.Изменяемость типа с этими вопросами не связана, см. другой мой коммент. К инстансу
ArrayList
указанные аргументы применимы в равной степени.std::swap
именно меняет ссылки, а не изменяет каждое из значений. В приведенном мной коде, кстати,int
. И это работает именно потому, что передача идет по ссылке, а не потому, чтоint
мутабелен.Судя по тому, что вы написали выше ("Передача по ссылке в C++ даёт вам те же возможности, что и обычная передача для больгинства типов в Java."), у вас была содержательная, а не терминологическая ошибка в картине мира.
А что до терминологии, то она вполне стандартна, и "считать, что в Java всё и всегда передаётся по ссылке" нельзя.
Промутировать аргументы — это не то же самое, что поменять их местами. Имелась в виду тождественость ссылок после вызова
swap
, а не равенство поequals
, разумеется.Не понял, что вы имеете в виду. Приведенный (невозможный) код написан на Java.
Дописывать и вообще разбирать ваш код мне неудобно и недосуг, извините. Вот (найденный) код с использованием
std::swap
:В Java так сделать нельзя, что с int, что с Integer.
Повторюсь, если вы думаете, что в Java агрументы передаются по ссылке, вы заблуждаетесь, причем заблуждаетесь капитально. Рекомендую погуглить что-то вроде "is Java pass-by-value". Например, на Stackoverflow это подробно разобрано. Ну или вот (часть 8.4.1 спецификации Java 8):
Вы заблуждаетесь.
Пример:
В языке, где есть передача по ссылке, функцию
swap
написать можно, а в Java — нельзя.Всё передается по значению, но для ссылочных типов значение является ссылкой. Это не то же самое, что передача по ссылке. Например, нельзя написать функцию, которая меняет местами аргументы (в отличие от, скажем, C++, где есть передача по ссылке).
Станет важным, как в реальности обедали философы? Вроде того, что Кант не пил пива?
Не могу с этим согласиться!
Знать, как в реальности работала голубиная почта, примерно так же важно, как знать, как именно обедали философы.
Благодарю.
Так я и писал, что с
partial(add, 1)
будет медленнее. Запустите, если не затруднит, еще и так:Ага, договорились. Замечу, что вы выше предлагали "отдельные типы для секунд, дней, месяцев, и так далее".
Конечно, я не предлагаю заводить фабричный метод для создания временного интервала из граммов. Важно не путать разные величины, а вот в каких единицах задано значение — неважно. Что-то типа
TimeDelta::fromSeconds
,TimeDelta::fromMonths
и так далее, возвращающие один и тот же тип (с типом для массы не совместимый). Нетрудно придумать единообразное внутреннее представление, с которым перегрузка будет работать единообразно. Иначе говоря, 24 часа и сутки — это ровно одно и то же. А вот какая польза от отдельных типов для интервала в секундах и интервала в минутах — неясно.