Pull to refresh
0
0
Send message

Тот случай, когда пара комментариев довольно много прояснила.

Тут речь о противоположном: коллеге хочется не увидеть тип, который не прописан, а скрыть тип, который прописан.

github.com/arbox/machine-learning-with-ruby — ну это, конечно, по сравнению с тем, что есть в Python, баловство.

Придирка к задаче про рост: вероятность одноточечного множества может быть и ненулевой, это зависит от распределения. Реально рост распределен более-менее нормально, но в формулировке это не сказано.

Уберите, пожалуйста, из плейлиста скрытый ролик (номер шесть).

Потому что это учебники про язык, а не про платформу.

На самом деле учебники, несомненно, "так делают", т.е. различают объекты и ссылки (включая учебники начального уровня, например, Head First).


Более того, это в явном виде написано по ссылке выше ("… в сообществах Java и Visual Basic ту же семантику часто описывают как «вызов по значению, где „значением“ является ссылка на объект»...").

Ещё раз, для идиотов.

Уверен, что вы кругом неправы в основах, но разговор окончен.

Проверить «тождественность ссылок» в Java нельзя…

Мне даже немного неловко это писать. Но как это нельзя? А что == делает?


На sdt:swap вам уже указали и примеры привели. Честно говоря, мне кажется, всего этого должно быть достаточно, чтобы увидеть свою неправоту.


Демонстрация swap со строками
// Example program
#include <iostream>
#include <string>

int main()
{
    std::string foo = "foo";
    std::string bar = "bar";
    std::cout << "foo: " << foo << " bar: " << bar << "\n";
    swap(foo, bar);
    std::cout << "foo: " << foo << " bar: " << bar << "\n";
}

Мутабельность std::string при этом ни при чем, потому что она не используется.


код std::swap
template<typename T> void swap(T& t1, T& t2) {
    T tmp(t1);
    t1=t2;
    t2=tmp;
}

Изменяемость типа с этими вопросами не связана, см. другой мой коммент. К инстансу 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...

Вы заблуждаетесь.


Пример:


String foo = "foo";
String bar = "bar";
swap(foo, bar);
// здесь foo приняло значение "bar", а bar" приняло значение "foo".

В языке, где есть передача по ссылке, функцию swap написать можно, а в Java — нельзя.

Всё передается по значению, но для ссылочных типов значение является ссылкой. Это не то же самое, что передача по ссылке. Например, нельзя написать функцию, которая меняет местами аргументы (в отличие от, скажем, C++, где есть передача по ссылке).

Станет важным, как в реальности обедали философы? Вроде того, что Кант не пил пива?
Не могу с этим согласиться!

Знать, как в реальности работала голубиная почта, примерно так же важно, как знать, как именно обедали философы.

Так я и писал, что с partial(add, 1) будет медленнее. Запустите, если не затруднит, еще и так:


timeit(lambda: sum(map(lambda x: x + 1, filter(lambda x: x % 2 == 0, ns))), number=10)

Ага, договорились. Замечу, что вы выше предлагали "отдельные типы для секунд, дней, месяцев, и так далее".

Конечно, я не предлагаю заводить фабричный метод для создания временного интервала из граммов. Важно не путать разные величины, а вот в каких единицах задано значение — неважно. Что-то типа TimeDelta::fromSeconds, TimeDelta::fromMonths и так далее, возвращающие один и тот же тип (с типом для массы не совместимый). Нетрудно придумать единообразное внутреннее представление, с которым перегрузка будет работать единообразно. Иначе говоря, 24 часа и сутки — это ровно одно и то же. А вот какая польза от отдельных типов для интервала в секундах и интервала в минутах — неясно.

Information

Rating
Does not participate
Registered
Activity