1. Ruby / Говнокод #20437

    +80

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    module SmsRu
      # Setup configuration
      mattr_accessor :api_id
    
      mattr_reader :queries
      @@queries = SmsRu::Config
    
      def self.setup
        yield self
      end
    
      # Sms.ru api settings
    
      # all possible queries is exactly 2 level deep
      @@stack_method ||= nil
    
      # we need to undefine method send because of we use it in the api
      class <<self
        undef_method :send
      end
    
      def self.method_missing(m, options = {})
        if @@stack_method
          query_options = queries.configuration.to_h[@@stack_method].to_h[m].to_h
          query_options.deep_merge!(api_id: api_id)
          query_options.deep_merge! options
    
          uri = URI.parse("http://sms.ru/#{@@stack_method.to_s}/#{m.to_s}")
          @@stack_method = nil
    
          response = Net::HTTP.post_form(uri, query_options)
    
          raise SmsRu::ConnectionError, 'you have troubles with internet connection or API query is missing' unless response.kind_of? Net::HTTPSuccess
          raise SmsRu::APIError, "something going wrong: query_options => #{query_options}, uri => #{uri}, response => #{response.body}" unless response.body.match(/^100/)
          response.body.split("\n")
        else
          @@stack_method = m
          return self
        end
      end
    end

    Опять руби притесняют :(

    сабж: https://github.com/asiniy/sms_ru/blob/master/lib/sms_ru.rb

    Запостил: Unnumbered, 27 Июля 2016

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

    • Чот раздел совсем сдох. :( Тут такая годнота, а никто не комментит.
      Ответить
      • Я думал, это руби сдох. Хипстеры уползли на ноджс, а любители DSL - на кложуру.
        Ответить
      • показать все, что скрытоbarop
        Ответить
      • Как Вы на нём только пишете, на этом руби. Хитрый китаец оказался тайным евреем
        В руби в принципе нет строк, одни указатели.
        Ответить
        • а как ты на этом поскале пишешь?
          Ответить
        • А в поскакале строка передается по значению или таки указателем? И в руби нет указателей, только ссылки.
          Ответить
          • показать все, что скрытоМой голубой друг столь заинтересован?
            В паскале - хз, в делфи - ссылочный, с подсчётом ссылок. Строки не мутабельны.
            А в руби строки - указатели, аналог PChar.
            Ответить
            • То есть вот так прямо указатель первый байт строки, и длину нужно считать за O(n)?
              Ответить
              • показать все, что скрытоНаверно да. Рубиевские строки допускают включение #0, тогда как паскалевские - нет. Очевидно, длина хранится по отрицательному смещению.
                Ответить
                • Я запутался. Придётся копать документацию.
                  Ответить
                  • показать все, что скрытоСорри, если что. Я спутал с нуль-терминированными.

                    В паскале длину строки хранит первый символ. Туда можно запихнуть вот такое чудо: str:='ололололо'#0'трололололо'; и при вызове Length длина будет корректной. Если же кастовать в PChar, то строка будет обрезана.
                    Ответить
                    • Да вот в том и дело, что в Дельфи (Турбо Паскале и прочих реализациях Object Pascal) строк много всяких и разных.

                      PChar — это тупо указатель на сишную нуль-терминированную строку (т. е. в ней нельзя хранить #0, а длина вычисляется медленно).

                      Истинно паскалевский тип string, переименованный в ShortString — это строка с присобаченным «нулевым» символом, хранящим длину (в такой строке можно хранить #0, а длина определяется мгновенно).

                      А есть ещё типы, появившиеся позже (всякие AnsiString, WideString, UnicodeString). Там переменная хранит указатель на строку, а перед строкой по отрицательному смещению хранится целая структура, содержащая длину строки, счётчик ссылок и прочие служебные данные. Т. е. хотя это и указатель, но распоряжаться им, как с сишными строками, указывая на середину строки, нельзя. Да, и #0 хранить можно, и длина определяется мгновенно, но память выделяется по-другому.
                      Ответить
                      • Похоже что строки это фундаментальная проблема программирования, и она не решаема.

                        Лучшие ЯПы о них споткнулись: паскаль, С++, Python2/3...
                        Ответить
                        • Что не так со строками в с++?
                          Ответить
                          • показать все, что скрытоЗавидую африканцам - у них секс прямо на пальмах растёт...
                            Ответить
                          • > Что не так со строками в с++?

                            Их нет.
                            Ответить
                            • Минусующим советую попробовать поработать с UTF-8 из C++ без подключения дополнительных библиотек.

                              То, что в C++ называется std::string — это на самом деле просто специализированная версия std::vector. В C++11 немного получше с UTF-8 стало, но итерацию по мультибайтным символам вперёд/назад вроде так и не завезли.
                              Ответить
                              • В С++ ЕМНИП так везде: только fixed-width кодировки поддерживаются. И в потоках, и в строках, и в локалях. А UTF-8 только для хранения и передачи.
                                Ответить
                            • Это не правда.

                              В С++ много разных, несовместимых между собою строк.
                              Выбирай любую! Пусть расцветают сто цветов!
                              Ответить
                        • Это фундаментальная проблема методов кодирования, не?
                          Ответить
                          • Бьюсь лицом об клавиатуру - так и кодирую.
                            Ответить
                • Да это же, блядь, гццшные старые крестовые строки. Сам string — указатель на обычный массив чаров, а по отрицательному смещению и хранится вся внутренняя хуйня. Зато её в принтф передавать можно было.
                  Ответить
          • В каком поскакале: в Турбо Паскале или в других реализациях?

            Для передачи в TP используется стек или (начиная со вторых Дельфей) регистры. Как думаешь, много в регистр влезет?

            Тем не менее, в Турбо Паскале есть три способа передачи:

            1. По ссылке (ключевое слово var). Изменённое в процедуре/функции значение сразу же отображается во внешнем мире.

            2. Как константу (ключевое слово const). Фактически это передача по ссылке, но компилятор запрещает внутри подпрограммы изменять значение.

            3. По значению. Для того, что не может вместить регистр (для массивов и строк, например), эмулируется: вызывающий код выделяет место для копии, копирует и передаёт в подпрограмму ссылку на копию. Таким образом, изменять значение внутри подпрограммы можно, но оно не затронет внешний мир, потому что оно на копии. Для атомарных же типов (инты всякие) копия не создаётся, они просто кладутся в стек/регистр.
            Ответить
    • показать все, что скрытоЬагор
      Ответить
    • показать все, что скрытоКакой багор )))
      Ответить
    • показать все, что скрытофу, не знал что руби похож на паскаль
      Ответить
    • кто юзает руби
      у того жопа в покликах
      Ответить

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