LINUX.ORG.RU

История изменений

Исправление khrundel, (текущая версия) :

Нет, корректность программы определяется именно компилятором. Если программа делает не то, что ты от нее ждешь – это твои проблемы, ты не знаешь языка.

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

Ты в очередной раз лжешь. От того, что ты напишешь «я тебе уже объяснил» ничего не изменится – ты слился, проблеяв про мифические мины, не приведя ни одной в пример.

Как не привёл? Я тебе вот прямо в прошлой ссылку давал. Ресолв урла через СУБД. У тебя мозги вообще не пашут?

Что характерно, именно избегая auto&& ты заложил мину с int и char.

Нет, тупица. Если написать auto&& ты, условно, получишь сообщения от компилятора в 0-50% случаев отсутствия ветки, в зависимости от того, что ты в эту ветку запишешь. Если не напишешь - получишь в 90%. До 100% ты не доведёшь никогда в виду особенностей приведения типа плюсов. Поэтому написание auto&& ситуацию ухудшает.

Мразь в очередной раз пытается проигнорировать сообщение

Ты подстелил соломку постфактум. В реальной жизни такого не происходит. Даже твой код до этого ничего подобного не содержал.

Цитату, ссылку на сообщение, где я делаю дефолтную ветку в матче. Сейчас увидим, насколько ты бездарен.

[](auto &&){} - - это и есть дефолтная ветка, тупица.

В принципе, на этом можно заканчивать – все ясно.А знаешь, почему не передаются? Потому что это не скейлится.

Нет, дебил ты конченый. Ещё раз, для тупых: в той же библиотеке джавы, ссылку на которую я дал как на самый конченый в плане любви к объектам язык, линия рисуется вызовом drawLine и параметрами x,y,x2,y2. Хочешь прямоугольник со скруглёнными углами - drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight). Для добавления другого примитива, авторы либы должны были бы писать новый метод drawXXX. И заметь, никакого draw(Shape shape) в этой библиотеке нет. Так устроены графические библиотеки, пока можно, они принимают простые команды, если уже нельзя - принимают сложные графические пути или модели. Вся эта срань типа class circle implements shape - её оставляют пользовательскому коду.

Что ты за идиот, тебе объяснили причину, дали пример, ты пример даже не посмотрел и начал нести свою ахинею опять.

Смотрим, как он блеял о том, что до std::variant в С++ не было вариантов.

Так и не было. Говорю же тебе, клоун, буст не в счёт. Вообще. Садись, клоун, двойка, твой ответ не принимается.

Что характерно, с самого появления плюсов люди пилили свои реализации динамических массивов с реаллокацией, иногда под конкретные типы, иногда обобщённые. И все нормальные люди описывали ситуацию: «в C++ нет динамических массивов с реаллокацией, однако язык позволяет их реализовать». Потом появилась STL и ситуация сменилась на «В стандартной библиотеке плюсов есть std::vector, являющийся динамическим массивом с реаллокацией». Но почему-то для варианта вдруг должно быть по другому, вдруг факт наличия какой-то черезжопной реализации (когда не было трюка с overloaded) где-то на сайте у Васяна, которая ещё не факт что твоим компилятором подхватится, начал означать, что вариант в плюсах был ещё в нулевых.

Нет, блин, не значит. Я бы ещё понял, если б у плюсов был пакаджменеджер, откуда автоматически качалась/обновлялась библиотека, но нет, гугл в помощь и иди ищи то не знаю что на домашней страничке какого-нибудь хакера из мамкиного подвала.

Не позорься. Символьные литералы к типу char отношения не имеют.

У тебя новая версия объяснения, почему тот код скомпилялся? Зря. Я ведь, тебе, чучелу, демонстрировал, что std::variant<int,char> = 'a'; выбирает именно char-ветку в случае её наличия в visitor. Так что символьный литерал - это именно char. Ты, видимо, с K&R C спутал.

Это буквально одно и то же. Разница лишь в том, что компилятор не навязывает выполнение проверки на ошибку.

Нет, чучело ты тупое.

вот тебе код на go:

message, err := foo();
fmt.Println(message);

Перепиши его на «аналогичный» раст с Result.

Или, более реалистичный

message2, err2 := foo();
if err != nil {
  fmt.Println(message2);
}

Ты уже написал 10^2 реализаций для Add? Там еще Mul и Div на очереди

Ты же в курсе, что в расте есть дженерики?

Проект в неподдерживаемом состоянии после тебя. Достаточно посмотреть на ветку match, которая там осталась после добавления обработчика Uuid, делающего ее недостижимой.

Я бы принял эту попытку свалить вину на предшественника если бы ты сам не вещал тут о необходимости auto&& веток. Я действовал в соответствии с предлагаемым тобой же методом, чтоб продемонстрировать этого метода ущербность. Если до тебя дошло наконец, что auto&& ветка - это зло, ну что ж, поздравляю тебя.

Кроме того, та ветка могла бы остаться и по иным причинам. Вполне возможно, что в варианте есть ещё какие-то способы идентификации, которые раньше обрабатывались общей с guid веткой, потом для guid сделали оптимизированную, а старую оставили для вот них. В любом случае, обработчик «для всего» - это зло. Если лень копипастить строчки, требуй синтаксиса вида [](A&|B&|C& value){ dbaccessor.get_data(val);}.

Ты ничего не ответил и слился, а далее при напоминаниях игнорировал.

Прочитал. Теперь хотя бы понимаю, почему ты, тупица, своё СВИНАЕ вспомнил.

Что я скажу: хрень там полная и дрочево на костыли из плюсов. СВИНАЕ в расте вообще невозможен, в виду наличия нормальных дженериков. ADL… Знаешь, давай представим что это вот реально та самая сложная штука, из-за которой авторы Раст сломались, плюнули и сказали что не будут оверлоады делать. Могли бы они обойтись без неё?

Да элементарно. В расте нет, например, операторов +(a,b), оператор всегда пилится через self. Так что foo + bar для раста - это всегда foo.add(bar), так что если у тебя foo в неймспейсе, то вопросов где брать add тупо нет, в трейте, который реализован для foo.

Видишь, очередная твоя надежда оказалась просто твоей тупостью и непониманием, отчего в плюсах всё так сложно. Ответ прост: потому что изначально сделано через жопу.

Ещё раз, для тупых, оверлоады в расте есть. Они используются для определения дженерика.

trait Fooable<T> {
    fn foo(&self, a: T);
}
impl Fooable<i32> for i32 {
    fn foo(&self, a:i32){
        println!("i32 foo called")
    }
}
impl Fooable<f32> for i32 {
    fn foo(&self, a:f32){
        println!("f32 foo called")
    }
}
...
    1.foo(1f32);
    1.foo(1);

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

С другой стороны, если ты добавишь:

trait Fooable2 {
    fn foo(&self);
}
impl Fooable2 for i32 {
    fn foo(&self) {
        
    }
}

то вызов 1.foo(1) перестанет компиляться и будет жаловаться на наличие 2х разных foo и требовать от тебя пояснения. Не смотря на разное число параметров. Так что мы видим сознательное решение по отключению перегрузки. Если одинаковые имена появились в виду наличия дженерика - раст соизволит найти нужную реализацию на основании параметров. Если они появились от того что случайно совпало, то раст отключает механизм перегрузки и требует написать Fooable::foo(&1, 1);

Исходная версия khrundel, :

Нет, корректность программы определяется именно компилятором. Если программа делает не то, что ты от нее ждешь – это твои проблемы, ты не знаешь языка.

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

Ты в очередной раз лжешь. От того, что ты напишешь «я тебе уже объяснил» ничего не изменится – ты слился, проблеяв про мифические мины, не приведя ни одной в пример.

Как не привёл? Я тебе вот прямо в прошлой ссылку давал. Ресолв урла через СУБД. У тебя мозги вообще не пашут?

Что характерно, именно избегая auto&& ты заложил мину с int и char.

Нет, тупица. Если написать auto&& ты, условно, получишь сообщения от компилятора в 0-50% случаев отсутствия ветки, в зависимости от того, что ты в эту ветку запишешь. Если не напишешь - получишь в 90%. До 100% ты не доведёшь никогда в виду особенностей приведения типа плюсов. Поэтому написание auto&& ситуацию ухудшает.

Мразь в очередной раз пытается проигнорировать сообщение

Ты подстелил соломку постфактум. В реальной жизни такого не происходит. Даже твой код до этого ничего подобного не содержал.

Цитату, ссылку на сообщение, где я делаю дефолтную ветку в матче. Сейчас увидим, насколько ты бездарен.

[](auto &&){} - - это и есть дефолтная ветка, тупица.

В принципе, на этом можно заканчивать – все ясно.А знаешь, почему не передаются? Потому что это не скейлится.

Нет, дебил ты конченый. Ещё раз, для тупых: в той же библиотеке джавы, ссылку на которую я дал как на самый конченый в плане любви к объектам язык, линия рисуется вызовом drawLine и параметрами x,y,x2,y2. Хочешь прямоугольник со скруглёнными углами - drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight). Для добавления другого примитива, авторы либы должны были бы писать новый метод drawXXX. И заметь, никакого draw(Shape shape) в этой библиотеке нет. Так устроены графические библиотеки, пока можно, они принимают простые команды, если уже нельзя - принимают сложные графические пути или модели. Вся эта срань типа class circle implements shape - её оставляют пользовательскому коду.

Что ты за идиот, тебе объяснили причину, дали пример, ты пример даже не посмотрел и начал нести свою ахинею опять.

Смотрим, как он блеял о том, что до std::variant в С++ не было вариантов.

Так и не было. Говорю же тебе, клоун, буст не в счёт. Вообще. Садись, клоун, двойка, твой ответ не принимается.

Что характерно, с самого появления плюсов люди пилили свои реализации динамических массивов с реаллокацией, иногда под конкретные типы, иногда обобщённые. И все нормальные люди описывали ситуацию: «в C++ нет динамических массивов с реаллокацией, однако язык позволяет их реализовать». Потом появилась STL и ситуация сменилась на «В стандартной библиотеке плюсов есть std::vector, являющийся динамическим массивом с реаллокацией». Но почему-то для варианта вдруг должно быть по другому, вдруг факт наличия какой-то черезжопной реализации (когда не было трюка с overloaded) где-то на сайте у Васяна, которая ещё не факт что твоим компилятором подхватится, начал означать, что вариант в плюсах был ещё в нулевых.

Нет, блин, не значит. Я бы ещё понял, если б у плюсов был пакаджменеджер, откуда автоматически качалась/обновлялась библиотека, но нет, гугл в помощь и иди ищи то не знаю что на домашней страничке какого-нибудь хакера из мамкиного подвала.

Не позорься. Символьные литералы к типу char отношения не имеют.

У тебя новая версия объяснения, почему тот код скомпилялся? Зря. Я ведь, тебе, чучелу, демонстрировал, что std::variant<int,char> = 'a'; выбирает именно char-ветку в случае её наличия в visitor. Так что символьный литерал - это именно char. Ты, видимо, с K&R C спутал.

Это буквально одно и то же. Разница лишь в том, что компилятор не навязывает выполнение проверки на ошибку.

Нет, чучело ты тупое.

вот тебе код на go:

message, err := foo();
fmt.Println(message);

Перепиши его на «аналогичный» раст с Result.

Или, более реалистичный

message2, err2 := foo();
if err != nil {
  fmt.Println(message2);
}

Ты уже написал 10^2 реализаций для Add? Там еще Mul и Div на очереди

Ты же в курсе, что в расте есть дженерики?

Проект в неподдерживаемом состоянии после тебя. Достаточно посмотреть на ветку match, которая там осталась после добавления обработчика Uuid, делающего ее недостижимой.

Я бы принял эту попытку свалить вину на предшественника если бы ты сам не вещал тут о необходимости auto&& веток. Я действовал в соответствии с предлагаемым тобой же методом, чтоб продемонстрировать этого метода ущербность. Если до тебя дошло наконец, что auto&& ветка - это зло, ну что ж, поздравляю тебя.

Кроме того, та ветка могла бы остаться и по иным причинам. Вполне возможно, что в варианте есть ещё какие-то способы идентификации, которые раньше обрабатывались общей с guid веткой, потом для guid сделали оптимизированную, а старую оставили для вот них. В любом случае, обработчик «для всего» - это зло. Если лень копипастить строчки, требуй синтаксиса вида [](A&|B&|C& value){ dbaccessor.get_data(val);}.

Ты ничего не ответил и слился, а далее при напоминаниях игнорировал.

Прочитал. Теперь хотя бы понимаю, почему ты, тупица, своё СВИНАЕ вспомнил.

Что я скажу: хрень там полная и дрочево на костыли из плюсов. СВИНАЕ в расте вообще невозможен, в виду наличия нормальных дженериков. ADL… Знаешь, давай представим что это вот реально та самая сложная штука, из-за которой авторы Раст сломались, плюнули и сказали что не будут оверлоады делать. Могли бы они обойтись без неё?

Да элементарно. В расте нет, например, операторов +(a,b), оператор всегда пилится через self. Так что foo + bar для раста - это всегда foo.add(bar), так что если у тебя foo в неймспейсе, то вопросов где брать add тупо нет, в трейте, который реализован для foo.

Видишь, очередная твоя надежда оказалась просто твоей тупостью и непониманием, отчего в плюсах всё так сложно. Ответ прост: потому что изначально сделано через жопу.

Ещё раз, для тупых, оверлоады в расте есть. Они используются для определения дженерика.

trait Fooable<T> {
    fn foo(&self, a: T);
}
impl Fooable<i32> for i32 {
    fn foo(&self, a:i32){
        println!("i32 foo called")
    }
}
impl Fooable<f32> for i32 {
    fn foo(&self, a:f32){
        println!("f32 foo called")
    }
}
...
    1.foo(1f32);
    1.foo(1);

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

С другой стороны, если ты добавишь:

trait Fooable2 {
    fn foo(&self);
}
impl Fooable2 for i32 {
    fn foo(&self) {
        
    }
}```
то вызов 1.foo(1) перестанет компиляться и будет жаловаться на наличие 2х разных foo и требовать от тебя пояснения. Не смотря на разное число параметров. Так что мы видим сознательное решение по отключению перегрузки. Если одинаковые имена появились в виду наличия дженерика - раст соизволит найти нужную  реализацию на основании параметров. Если они появились от того что случайно совпало, то раст отключает механизм перегрузки и требует написать `Fooable::foo(&1, 1);`