1. Go / Говнокод #27453

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    func Map[F, T any](s []F, f func(F) T) []T {
        r := make([]T, len(s))
        for i, v := range s {
            r[i] = f(v)
        }
        return r
    }

    Го сдался.

    Запостил: PolinaAksenova, 02 Июня 2021

    Комментарии (161) RSS

    • Как вы уже наверняка знаете, proposal по дженерикам в Golang принят (официально это называется type parameters) и будет имплементирован в go 1.18. Бета будет доступна уже в конце этого года. А это значит, что пора разобраться, на чём в итоге остановились разработчики языка — ведь черновик type parameters постоянно менялся в течение последних лет.


      Технология новая, на практике толком никто не использовал. Поэтому если увидите какую-то неточность в статье, не стесняйтесь указать это в комментариях.


      Самостоятельно поиграться с дженериками можно здесь


      Итак, поехали.

      https://habr.com/ru/company/karuna/blog/552944/
      Ответить
      • [quote]
        В go действительно порой очень не хватает дженериков, но решается это легко решается при помощи копипасты.
        [/quote]
        https://habr.com/ru/company/karuna/blog/552944/#comment_23107214

        Вообще говоря при помощи копипасты очень многие задачи решаются в прогрммировании. Недооценённый инструмент
        Ответить
        • > В go действительно порой очень не хватает дженериков, но решается это легко решаетсяпри помощи копипасты

          Видимо уже решилось
          Ответить
    • А вот такие дженерики в «Nim»:
      proc Nyaka[Kowaii](kero: Kero): Kowaii =
        discard


      > Технология новая, на практике толком никто не использовал.

      Не мудрено, ведь в «РНР» нет никаких дженериков :-)

      > Несколько лет назад у нас в Каруне (Камеруне?!) возникла необходимость перевести несколько сервисов с PHP на GO. Как сейчас помню, в первой же программе потребовалось проверить, существует ли строка в некотором слайсе строк. Беглый гуглёж показал, что встроенной функции, аналогичной пхпшной in_array() в языке нет. Поэтому пришлось написать свою...

      Мне аж самому стыдно такое читать.
      Ответить
      • >Поэтому пришлось написать свою...
        го такой го
        Ответить
      • > существует ли строка в некотором слайсе строк

        А я ещё думала, что в крестах стрёмная стандартная либа...
        Ответить
        • А я не поняв, что тут вообще имеется в виду.

          Типа вот у нас «слайс» (массив) строк, и нам нужно проверить, есть ли там заданная строка?
          Ответить
          • Ну да, std::find(slice.begin(), slice.end(), str) походу.
            Ответить
            • Ещё можно сделать reduce по слайсу, использовав лямбда-компаратор.
              Ответить
              • причем искать (серчить, а не файндить) можно не только строку, а вообще любую подпоследовательность с begin и end.

                Итераторы и алгоритмы это круто:)
                Ответить
                • Если тебе они так нравятся, присмотрись к языку программирования «Go»: там, говорят, нихуя нет в стандартной либе, поэтому алгоритмы приходится каждый раз реализовывать самому!

                  Кстати, это ещё и объясняет, зачем Гугл так гоняет всех соискателей по алгоритмам.
                  Ответить
                  • Во всяких сложных, запутанных, устаревших и ненужных языках есть готовые решения в
                    #include <algorithm>
                    #include <functional>



                    а в современных безопасных языках типа "Go" наконец программистам дали возможность писать поиск в массиве руками

                    > Гугл так гоняет всех соискателей по алгоритмам.

                    точно) они небось и кусорт пишут
                    Ответить
                    • > они небось и кусорт пишут

                      А потом инлайнят вручную, т.к. функции после введения дженериков как-то шибко медленно работают.
                      Ответить
                      • Это как ПХПшники двойные кавычки на одинарные меняют, чтобы быстрее работало
                        Ответить
        • Так и в бога верить перестанешь https://stackoverflow.com/questions/10485743/contains-method-for-a-slice
          Ответить
    • Настоящий программист на go не будет пользоваться этой ересью.

      Явное лучше неявного.
      Ответить
      • Гугл наслал на нас дженерики чтобы проверить нашу волю и веру в Го. Не предавайтесь искушению, братья и сёстры. И помните -- явное лучше неявного.
        Ответить
      • А думаю, что через неделю все гоферы будут писать: "В го появилась новая крутая штука -- генерики. Теперь программировать на Го стало еще удобнее. А в вашем языке небось этого нету?"
        Ответить
    • Как говорили в одном докладе, копипаста -- хорошее, медитативное занятие.
      Ответить
    • > The key point here is our programmers are Googlers, they’re not researchers. They’re typically, fairly young, fresh out of school, probably learned Java, maybe learned C or C++, probably learned Python. They’re not capable of understanding a brilliant language but we want to use them to build good software. So, the language that we give them has to be easy for them to understand and easy to adopt.

      Видимо, гуглу наконец удалось своих программистов чему-то научить.
      Ответить
      • Я думаю через год-другой запретят в кодестайле писать свои дженерики, можно будет юзать только стандартные, про которые есть видеотуториал.
        Ответить
      • А почему нельзя нанять толковых ребят, если ты Гугл? Нет экономического смысла, или просто на рынке нету столько хороших программистов?

        Зачем брать на работу чувака, который фреш аут оф скул, и ничего кроме джавы в жизни не видел?
        Ответить
      • Кстати, как-то это fresh out of school не стыкуется с выносом мозга на 5-6 собеседованиях. Что-то они недоговаривают...
        Ответить
        • Если в школе учили вертеть на хуе на доске красно-черные деревья со скоростью 100 оборотов в секунду, то согласуется.
          Ответить
        • Может быть все нормальные парни слышат, что в г реально крутой уровень программеров, и не идут туда, не считая себя богами (я знаю, что ничего не знаю), и в итоге весь хр гугла засран самоуверенными нубами, заражёнными идеологией т.н. "успешности", и научившиеся по мотивационным книжкам проходить собес? Ну, кроме романа кашицина.

          Потому что последнее время продукты гугла - говно на палочке, особенно все эти гайды пол материал дизайн. Какого вдруг хуя все аватарки стали круглыми? И если нет юзерпика, то есть какие-то ебаные буквы
          Ответить
          • > Какого вдруг хуя все аватарки стали круглыми?

            Говорят, что фотки в круглых рамочках лучше смотрятся, чем в квадратных. В общем-то у меня нет какого-то отвращения к кругам. Да и сам материал дизайн неплохо смотрится, лаконично.
            Ответить
            • Кто говорит?

              И это что, на ГК устаревший дизайн что ли?
              Ответить
            • Ну ок, если тебя эстетически устраивает материал десигн, вернёмся к классическому примеру гуглового ui/ux: настройки аккаунта в гугле и ютубе))
              Ответить
              • Не напоминай. Я тут переключалку на тёмную тему минут пять искала на днях.

                А ещё на ютубе испортился алгоритм по которому он ролики советует. Раньше как-то больше разнообразия было, а сейчас по кругу одно и тоже крутит.
                Ответить
                • Ты просто уже посмотрел всё интересное на ютюбе, пора удалять аккавунт.
                  Ответить
                • подтверждаю, заглянул туда посмотреть как в Златохуйске ветер меряют узелками и мне теперь почему-то советуют видево с отключенными каментами и попробовать youtube kids
                  Ответить
                  • Зачем ты это смотрел?
                    Ответить
                    • потому что у тебя на скрине сранные юниты ветра

                      а еще потому что у меня традиционный багор с них, который начался еще лет 10 назад, когда я обнаружил что в погодные ведропроги не кладут привычные юниты и без отдельного конвертера единиц хуй сравнишь какой прогнос врёт, а какой нет
                      Ответить
                  • > видево с отключенными каментами

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

                    З.Ы. Не то чтобы мне хотелось читать комменты на ютубе, конечно.
                    Ответить
                    • потому что нет адекватного способа проверить, детская ли на самом деле учётка или нет?
                      Ответить
                    • > Не то чтобы мне хотелось читать комменты на ютубе

                      - я понял, куда пропал Пи. Постоянно попадает на ютубе на ролики с отключёнными комментариями и не хватает fuel'а, чтобы креативить на ГК
                      Ответить
                    • Там еще и (Android) мини-проигрыватель отключается, если видео детское, но при этом снизу еще и выдвигается уведомление. Сдвигая проигрыватель, да. То есть жмешь на крестик, чтобы закрыть всё равно не работающее окошко, а попадаешь на ссылку "Почему мини-проигрыватель отключен?". В интернете это называют Click Hijacking и бьют по рейтингу, а тут хз.

                      Ну ладно, когда тамжедети!!!, там адекватности вообще ждать не приходится, но вот, вроде бы, нормальная хотелка - проиграть ровно одно видео из плейлиста (Watch Later, например) и остановиться, чтобы после конца песни не начинала орать следующая, ну или читаешь коменты, пока титры идут, а он тебе всё харе, вот тебе следующиее видео.
                      На десктопе просто - идешь в адресную строку, удаляешь list=WL и перезапускаешь, а на мобиле... ну тоже просто:
                      - Перетаскиваешь видео в конец плейлиста
                      - Ждешь несколько секунд, чтобы плейлист сохранился
                      - Запускаешь...

                      Но есть и положительные стороны - если вдруг захочется упороться наберите youtube kids be like amogus. Кратковременное расслоение мозжечка гарантировано. Говорят, от настоящего for kids не сильно отличается. Впрочем, Сыендук делал обзор и объяснял, почему так.
                      Ответить
                      • говорят, этим летом Ютуб введёт обязательный показ рекламы во ВСЕХ видео вне зависимости от того, что там наклацал автор

                        как можно будет теперь им пользоваться на мобиле или на каком-нибудь смарттв, я себе слабо представляю
                        Ответить
                        • Ютуб продвигает платную подписку. Скоро для всех не купивших будут не рекламу в виде вставлять, а наоборот — видео в рекламу.
                          Ответить
                          • Наконец-то я избавлюсь от очередного порока.
                            Ответить
                            • По-моему это не работает. Просто одна зависимость заменяется на другую.
                              Ответить
                          • так давно уже к этому шло
                            началось всё еще в 2018 (емнип) с youtube premium, они даже высрали несколько крайне убогих сериалов в жанре сайфай
                            имею ввиду полноценных сериалов, не веб-огрызки которые делает например Machinima

                            ublock origin нормально с рекламой справляется
                            Ответить
                            • > ublock origin
                              - в мобильном приложении?)
                              Ответить
                              • ну fennec поставишь
                                все равно реклама больше ресурсов сожрёт
                                Ответить
                                • что такое fennec?
                                  Ответить
                                  • Самая маленькая в мире лиса со смешными ушами-радиаторами
                                    Ответить
                                  • https://en.wikipedia.org/wiki/Mozilla_Fennec
                                    Ответить
                                    • так ты мне предлагаешь на мобиле ютуб в браузере смотреть на постоянной основе? и как там с юзабилити?
                                      Ответить
                                      • > ютуб в браузере

                                        И у любви у нашей села батарейка.
                                        Ответить
                                        • еще вопрос что прожоливее будет, барузер без рекламы или засранное рекламой bloatware которое спамит уведомлениями
                                          Ответить
                                      • NewPipe.
                                        Ответить
                      • что означает слово "сыендук"?
                        Ответить
                        • Это фамилия одного ютубера. Довольно любопытно. Откуда она произошла - не знаю.
                          Ответить
                          • youtu.be
                            Ответить
                            • Это фишинговый сайт, маскируется под название Ютюб (youtube), реальный домен такой: http://www.YouTube.com
                              Ответить
                          • > Откуда она произошла

                            Из неправильной раскладки, походу. На английской лучше читается.
                            Ответить
                      • тупой сæндук запрыгнул в этот вагон на пару месяцев позже белых людей и совершенно не уловил сути elsagate
                        Ответить
                        • Ты по кофейной гуще пишешь комментарии?
                          Ответить
                          • а когда просохнут - сканирую и на говнокот отправляю
                            лучше всяких вакомов
                            Ответить
    • > Т.е. обобщенная функция будет компилироваться один раз и будет иметь некоторые потери в рантайме. В то же время обобщённые типы будут компилироваться для каждого варианта отдельно, что увеличит лишь время компиляции.

      «Go» в консистентности равняется на питухон.
      Ответить
      • Но для работы с обобщённым типом один фиг понадобится обобщённая функция, так что потери будут и там и там?
        Ответить
        • Нууу, «лучший код – это отсутствие кода», Так что можно понаписать обобщенных типов, а функции для них не писать :-)
          Ответить
          • А зачем нужны типы без функций над ними, если это не какая-нибудь эзотерика? Ты ведь их даже создать не сможешь, т.к. конструктор -- тоже функция.

            З.Ы. Ну хотя... в coq есть тип False. У него нет ни одного конструктора. Именно этим он и полезен.
            Ответить
            • В TS есть литерал тайпс.

              Можно сделать тип 'petuh'. Переменная этого типа может иметь значение 'petuh', а больше никакое не может.

              Создается строковым литералом
              Ответить
              • Ну здесь у тебя есть один конструктор. А у False их вообще нет.
                Ответить
                • Это не конструктор, это ссылка на существующий объект: я не могу иметь более одного экземлпяра этого типа

                  а False не создать никак?
                  Ответить
                  • > а False не создать никак

                    Нет, в том и фишка. Если ты каким-то образом смог написать функцию, которая его возвращает -- то или функция хуйня или аргументы противоречат друг другу
                    Ответить
                    • А в TS есть типа "never" (в коко что-то такое же есть кажется)
                      Ответить
                      • > never

                        Да-да, оно самое и есть. Только в коке завершение функций гарантированно, поэтому кейс с "заебашу вечный цикл и верну never" там не катит.
                        Ответить
                        • > в коке завершение функций гарантированно

                          То есть доказать бесконечность цикла там нельзя?
                          Ответить
                          • > доказать бесконечность цикла там нельзя

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

                            Один аргумент всегда должен уменьшаться в рекурсивном вызове.

                            Если ты сёмантику какого-то другого языка описываешь на коке -- там можно доказать. Ну опять же, вручную, для конкретных кейсов.
                            Ответить
                            • То есть наивным подходом даже проверить гипотезу Коллатца для какого-то числа не получится, нужно как-то изъебнуться?
                              Ответить
                              • Для какого-то числа получится, если немножко изъебнуться. Убывающий счётчик итераций добавить, к примеру. И засунуть в него достаточно большое число.

                                В общем виде -- ну х.з. премию получишь, наверное, если уговоришь coq этот цикл сконпелять. Это ведь равносильно пруфу данной гипотезы.
                                Ответить
                    • ... Разговор о «TypeScript» плавно перешёл в разговор о «Coq» ...
                      Ответить
                      • Да у них много общего, оказывается. Авторы TS'ки всё-таки курили теорию типов, а не как в жс.
                        Ответить
                        • Да, в TS очень хорошая типизация. Его кстати делал чел, который делал борланд паскаль и си шарп вроде

                          >а не как в жс.

                          шутка_про_тип_null_и_object
                          Ответить
              • нахуя это может быть нужно?
                Ответить
                • Да просто как маркер какой-нибудь, чтобы другую перегрузку функции выбрать, к примеру. В крестах для этого пустые структурки юзают.
                  Ответить
                • для структурной типизации

                  Тип поля петуха в коде ниже -- "petuh".
                  interface Bird {
                      type: string;
                  }
                  
                  interface Petuh extends Bird {
                      type: 'petuh';
                  }
                  
                  interface Kuritsa extends Bird {
                      type: 'kuritsa';
                  }
                  
                  class Sema implements Petuh {
                      type: "petuh"; //
                  }
                  
                  // не скомпилируется class Rotojop implements Petuh {
                  //     type: "php"; 
                  // }
                  
                  function doAll(bird: Petuh | Kuritsa) {
                      switch (bird.type) {
                          case "petuh":
                              console.log("Petuh");
                              break;
                          case "kuritsa":
                              console.log("Koortisa");
                              break;
                          // не скомпилируетс case "bar":
                          //     break;
                      }
                  }
                  
                  doAll(new Sema());
                  doAll({type: "petuh"});
                  // не скомпилируетсяф doAll({type: "foo"});


                  Тут ты можешь спросить: "а почему нельзя проверить instanceof Petuh, и не привязываться к полю в рантайме?"

                  А потому, что инстансы петуха могут прийти просто как объекты ({type:petuh})
                  Ответить
                  • чем это лучше энама?
                    Ответить
                    • В enum у тебя есть одно место, в котором перечислены все возможные значения.
                      Где тут такое место видишь?

                      Там еще ниже по коду такая функция есть
                      function petuhOnly(bird: Petuh) {}
                      Ответить
                      • > есть одно место, в котором перечислены все возможные значения.

                        - чем это плохо?

                        Есть какой-то реальный пример без петухов и куриц?
                        Ответить
                        • Енам это полноценный жс объект и остаётся после компиляции, строковый тип - нет

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

                          А вообще они взаимозаменяемы, если функция принимает енам из чисел то и просто число примет если можно вывести что это число принимает только значения членов енама
                          Ответить
                        • На беглый взгляд это попытка паттернматчинга, оставаясь в рамках синтаксиса js, чтобы не сильно переделывать инструменты. Поэтому строки.

                          Какая разница, кто соберёт это в enum, программист или компилятор?
                          И какая разница, строки это или идентификаторы / кейворды, если за этим следит транспилер и подсветка синтаксиса? Такая вот типизация миллениалов, а хули ты хотел?
                          Ответить
                        • Есть реальный пример получения объектов из JS, которые про твой енум не знают.

                          Вот тебе по вебсокету пришли объекты, у которых в поле "type" строкой указан тип.
                          Это или "user" или "group".

                          TS позволяет это статически проверить
                          Ответить
                          • TS позволяет это статически проверить

                            нет не позволяет

                            ты описал тип
                            type ServerShit = { 
                              type: 'user';
                              name: string;
                             } | {
                               type: 'group';
                               id: string;
                             }
                            
                            function handleShit(shit: ServerShit) {
                              if (shit.type === 'user') {
                                return shit.name
                              } 
                              return shit.id
                            }

                            А потом бекенд добавил в респонсы type: 'petuh' и ты обосрался

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

                            данные нужно валидировать и тайп скрип тебе в этом не поможет
                            Ответить
                            • речь шла о том, что ты можешь сделать switch по значению поля "type", TS проверит, что ты обращаешься к тем полям, которые есть у объекта согласно описанию их в TS.

                              бек, разумеется, может этот контракт нарушить, но тут тебе ничего уже не поможет: компилятор за бек не в ответе
                              Ответить
    • ```
      func Map(s []{{ .F }}, f func({{ .F }}) {{ .T }}) []{{ .T }} {
      r := make([]{{ .T }}, len(s))
      for i, v := range s {
      r[i] = f(v)
      }
      return r
      }
      ```

      Кодогенерация - наше всё...
      Ответить
      • ого, какой простой и легкочитаемый код
        Ответить
        • Да вроде просто подстановка {{ параметров }}, макросня обычная.
          Ответить
          • Зачем два символа? Чтобы на строковые интерполяции быть похожими или на джинджу?

            Вообще

            func Map(s: Array<F>), f: func(F));

            было бы понятнее
            Ответить
            • Все одиночные скобочки уже под другие цели заняты, видимо.
              Ответить
              • В углу тихо хихикнул С++ и ObjC:)

                Надо было вообще сразу генерики делать, и не выеживаться.
                Джава на эти грабли наступила, c# чуть-чуть испачкался, кем надо быть, чтобы в 2009-м году запускать ЯП без генериков?
                Ответить
                • > С++

                  Они пишут, что парсер в го тупой и они не хотят его усложнять. Именно поэтому в дженериках заюзали [ ] а не < >, которые будут конфликтовать со сравнениями.
                  Ответить
                  • в D вообще в шаблонах !
                    Ответить
                  • :|

                    Это насколько ж он тупой. Неужели по контексту нельзя отличить сравнение от даймонда
                    Ответить
                    • В этом разница контекстно-свободной и контекстно-зависимой грамматик в общем-то
                      Ответить
                • за пределами коллекций без дженериков можно и обойтись в общем-то
                  Ответить
                • К слову, даже в крестах много лет нельзя было писать A<B<C>> в шаблонах, надо было пробел между >> оставлять. Что уж говорить о го.
                  Ответить
                  • ну пушо в сишечке был оператор сдвига небось, и нужно было как-то быть обратно совместимым

                    но питухи то с ноля писали
                    Ответить
                    • Да, в крестах, насколько понимаю, вообще неограниченная грамматика по Хомскому.

                      Ибо в некоторых случаях нужно вычислять выражения в компайлтайме чтобы отличить a<b> c от a < b > c.

                      Представь какой там ад в поддержке и тестировании. А в гошке контекстно-свободная скорее всего, как в паскале. Так что я понимаю их выбор.
                      Ответить
                      • Именно потому компилятор крестов может компилировать вечно?:)
                        Для контекстно свободной вроде автомат с магазином используется

                        >Представь какой там ад в поддержке и тестировании
                        то-то я смотрю, что решарпер шаблоны не особо-то и раскрывает, и код весь зеленый, а компиляция падает с пиздецовой ошибкой
                        Ответить
                        • > компилировать вечно

                          Он и парсить вечно может, походу... Но на практике обычно просто память кончается или лимиты на вложенность, GC ещё не завезли.
                          Ответить
                          • Если бы у крестов не было шаблонов, то не было бы и таких проблем, верно?

                            А как можно было бы сделать красиво обобщённое программирование без шаблонов и без потери перформанса?
                            Ответить
                            • Гомоиконность!
                              Ответить
                              • Если у тебя в компайлтайме весь код представлен как данные, то ты очень легко можешь написать бесконечный цикл, и никогда не скомпилироваться, не?
                                Ответить
                                • Ну да. Поэтому зависания неизбежны для продвинутой метушни. Надо просто это понять и принять.
                                  Ответить
                                • Бесконечный цикл (точнее, рекурсия) и на шаблоноговне легко пишется.
                                  Ответить
                              • Гомоиконность фигня, надо чтобы тактики, которые работают не с AST, а с типизированными термами языка.
                                Ответить
                            • > сделать красиво обобщённое программирование

                              А хер знает, тут всегда джва стула же: либо ты делаешь юзаешь один инстанс для всех и теряешь пирфоманс и гибкость, либо делаешь разные инстансы под разные типы и теряешь место и простоту.

                              > проблем

                              Да не то чтобы это было проблемой... Любая достаточно продвинутая метушня может виснуть. Иначе она неполноценна и имеет кучу ограничений (см. сишные макросы).
                              Ответить
                              • Предлагаю ввести критерий зависания. Если метушнёй нельзя подвесить компилятор — она не полноценная.

                                А в вашем <ЯП> можно подвесить компилятор?
                                Ответить
                                • В моём основном языке вовсе нет метушни. Даже макросов нет. Даже простейшего препроцессора.

                                  Впрочем, можно подключить какие-то патчеры AST к компилятору
                                  Ответить
                                  • Это кто
                                    Ответить
                                  • Джава?

                                    > патчеры AST

                                    Какая гомоиконность )))
                                    Ответить
                                    • Ну да, или котлин

                                      >Какая го
                                      не совсем: они же не в моем коде, а отдельным агентом

                                      А как работает ломбок? а NotNull как?

                                      Вот в груви можно налету патчить, но груви увы

                                      ps: Или я напиздел, и там патчат байткод?
                                      Ответить
                                      • > А как работает ломбок?
                                        Через annotation processors и модификацию байткода, хотя сами процессоры для этого ня преднязначены, а весь Ломбок — грязный хак.

                                        https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html
                                        https://www.raywenderlich.com/8574679-annotation-processing-supercharge-your-development (Котлин)
                                        Ответить
                                        • Значит всё таки не с AST, а с байткодом..
                                          Ответить
                                          • Вот я раньше слышал заявления (нахрюки), что питон позволяет делать страшные вещи, ведь скрипт может изменять себя самого!!! (Что-то дописывать в конец или начало, как в обычный файл), но потом я узнал про байт-код и приуныл.
                                            Ответить
                                            • Ну eval то есть.
                                              Ответить
                                              • evalом создать функцию, прибиндить её к классу вместо оригинального метода и вуаля — monkey patch готов.

                                                А в майкрософте с их крестами приходится специально обученный компилятор использовать, чтобы он в начале функций несколько nop'ов вставлял, чтобы туда можно было jmp прописать в случае чего.
                                                Ответить
                                                • Красивее всего это сделано в руби; там просто открываешь класс, срёшь туда, и закрываешь обратно

                                                  можешь в Number насрать
                                                  Ответить
                                                  • А потом собирай куски этого класса по всей кодовой базе...
                                                    Ответить
                                            • a.bat
                                              @echo echo А ваш питон так может? :D >> a.bat
                                              Ответить
                                      • Но груви увы что?
                                        Ответить
                  • Пиздец
                    Ответить
    • [quote]
      Вообщем чёрт его знает. Если perl красив тем, что можно написать одно и тоже триллионом разных способов (и как раз эта замечательная особенность многим не нравится, а особенно она не нравится бизнесу и энтерпрайзу). Go — прекрасен тем, что он дубовый и кондовый. Просто берёшь, просто делаешь и моментально получаешь результаты высокого качества
      [/quote]

      Блядь, я словно бы снова в 1999-м году.

      Джава точно так же кичилась тем, что "кондовая" и птион тоже.
      И в итоге кондовость была признана недостатком.
      Ответить
      • > Блядь, я словно бы снова в 1999-м году

        - простыня мокрая?
        Ответить
      • А питон разве кондовый?
        Ответить
        • Ну типа "у нас в питоне всё просто, даже свитча нет, и элвиса нет, и лямбды убогие, мы за максимальную простоту"

          Ага.

          Вот тебе код на 3.10

          from typing import Generic, TypeVar, Union
          
          T = TypeVar('T')
          
          class Result(Generic[T]):
              first: T
              other: list[T]
          
          result: Union[Result[int], Result[str]]
          
          match result:
              case Result(first=int()):
                  ...  # Type of result is Result[int] here
              case Result(other=["foo", "bar", *rest]):
                  ...  # Type of result is Result[str] here

          проще некуда
          Ответить
    • Всё-таки каким грязным выглядит код на Go...
      Ответить
      • Переведи на "PHP".
        Ответить
      • Приведи пример грязного кода на «Go» и кода на «PHP», чтобы уловить разницу, даже будучи неискушенным программистом.
        Ответить
        • if(!call_user_func(function(){ # Переменные окружения
              ini_set('display_errors', 1);
              date_default_timezone_set('Europe/Moscow');
              header('Content-Type: text/html; charset=utf-8');
              setlocale (LC_ALL, "Russian"); putenv("LANG=ru_RU");
              return error_reporting(E_ALL /*& ~E_NOTICE & ~E_STRICT*/);
            })){ mpre("ОШИБКА Установка системных переменных и уровня отчета ошибок");
          }elseif(function_exists("mb_internal_encoding") && !mb_internal_encoding("UTF-8")){ mpre("Кодировки библиотеки корвертации");
          }elseif(!$conf["db"]["open_basedir"] = call_user_func(function($open_basedir = null){ # Расчет пути до корня системы
          		if(strpos(__DIR__, "phar://") === 0){ $open_basedir = implode("/", array_slice(explode("/", dirname(__DIR__)), 2)). "::". __DIR__; # Файл index.php внутри phar архива
          		}elseif(file_exists($phar = __DIR__. DIRECTORY_SEPARATOR. "index.phar")){ $open_basedir = strtr(ini_get("open_basedir") ?: __DIR__, [':'=>'::']). "::phar://{$phar}"; # Не в phar
          		}else{ $open_basedir = strtr(ini_get("open_basedir") ?: __DIR__, [':'=>'::']);
          		} return $open_basedir;
          	})){ print_r("ОШИБКА получения пути до корня системы");
          }elseif(!isset($index) && ($index = './index.php') && file_exists($index)){ include $index; if($conf) die;
          }elseif(!$mp_require_once = function($link){
          		global $conf, $arg, $tpl;
          		foreach(explode('::', $conf["db"]["open_basedir"]) as $k=>$v){
          			if(!file_exists($file_name = "$v/$link")) continue;
          			require_once $file_name; return $file_name;
          		} return $file_name;
          	}){ mpre("Функция подключения ресурсов");
          }elseif(!$mp_require_once("include/config.php")){ mpre("ОШИБКА подключения файла конфигурации");
          }elseif(!$mp_require_once("include/func.php")){ mpre("ОШИБКА подключения функций системы");
          //}else if(true){ pre($conf["db"]["open_basedir"]);
          Ответить
          • Ок, а теперь на "PHP" для сравнения.
            Ответить
            • if err != nil {
              return nil, err
              }
              Ответить
              • while ($a.next() !== 0) {
                process($a.next())
                }
                Ответить
              • > return nil, err

                Главное не перепутать...
                Ответить
                • Если вдруг перепутал, то нужно не по спине стучать, а об стул прыгать.
                  Ответить
                • И не забыть написать это после каждой функции

                  Нужно быть немножко внимательнее просто
                  Ответить
                  • Копипаста -- это полезно и медитативно.
                    Ответить
                    • Пишут, что вот такая штука может помочь
                      https://pbs.twimg.com/media/DCIF7-2W0AEAv9c.jpg

                      Не думайте, что я шучу
                      https://twitter.com/NateTheFinch/status/899730215957561344
                      Ответить
                      • ну сниппет сделать много таланта не надо

                        кстати, питухи, делаете свои кастомные сниппеты в своей любимой иде?
                        Ответить
                        • > кстати, питухи, делаете свои кастомные сниппеты в своей любимой иде?

                          Не люблю сниппеты. Если нужно постоянно набирать одно и то же, то ты делаешь что-то не то, а для питушни типа ключевых слов и конструкций языка полезнее скорость слепой печати прокачать, чтобы стать боссом опен-спейса со своими Cherry MX Blue.
                          Ответить
                          • звучит как преувеличение
                            Ответить
                            • Джава мэнам не понять
                              ヽ( ̄ω ̄(。。 )ゝ
                              Ответить
                              • У шарпеев в WPF еще был крутой сниппет
                                https://stackoverflow.com/questions/42691402/is-there-a-way-to-automatically-create-dependencyproperty-in-mvvm/42691472

                                ``propdp`` раскрывался в
                                // https://professorweb.ru/my/WPF/base_WPF/level4/4_6.php
                                public int CurrentNumber
                                        {
                                            get { return (int)GetValue(CurrentNumberProperty); }
                                            set { SetValue(CurrentNumberProperty, value); }
                                        }
                                
                                        // Using a DependencyProperty as the backing store for CurrentNumber.  This enables animation, styling, binding, etc...
                                        public static readonly DependencyProperty CurrentNumberProperty =
                                            DependencyProperty.Register("CurrentNumber", typeof(int), 
                                            typeof(ShowNumberControl), new UIPropertyMetadata(0));

                                Это одно проперти (тн зависимое)

                                Это вам не гошная проверка ошибок
                                Ответить
                    • Харе Пайк, Харе Гугл
                      Ответить
          • Если это код на «РНР», то я даже боюсь представить, какой грязный относительно него код на «Go»...
            Ответить
    • Ну и хуй с ним.
      Ответить
    • Google gonna go
      Ответить

    Добавить комментарий