Яuбy / Говнокод #20437 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Unnumbered, (Updated )

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

  • Чот раздел совсем сдох. 🙁 Тут такая годнота, а никто не комментит.
    Ответить
    • Я думал, это руби сдох. Хипстеры уползли на ноджс, а любители DSL - на кложуру.
      Ответить
    • Как Вы на нём только пишете, на этом руби. Хитрый китаец оказался тайным евреем
      В руби в принципе нет строк, одни указатели.
      Ответить
      • А в поскакале строка передается по значению или таки указателем? И в руби нет указателей, только ссылки.
        Ответить
        • Мой голубой друг столь заинтересован?
          В паскале - хз, в делфи - ссылочный, с подсчётом ссылок. Строки не мутабельны.
          А в руби строки - указатели, аналог 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. По значению. Для того, что не может вместить регистр (для массивов и строк, например), эмулируется: вызывающий код выделяет место для копии, копирует и передаёт в подпрограмму ссылку на копию. Таким образом, изменять значение внутри подпрограммы можно, но оно не затронет внешний мир, потому что оно на копии. Для атомарных же типов (инты всякие) копия не создаётся, они просто кладутся в стек/регистр.
          Ответить
    • Ни на той, ни на другой хуйне не пишу. Предпочитаю "PHP".
      Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8