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

    −55

    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
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    module CoreExt; module Array
    
      # Check if all array members are instances of given class(es).
      #
      # @return [Boolean]
      # @param [Array, Class] klasses_allowed Array of classes, or a single class
      # @note Returns <tt>true</tt> if the array is empty.
      def is_array_of?(klasses_allowed)
        if klasses_allowed.kind_of? Array
          fail ArgumentError, "Array of Classes expected. Some members are not instances of Class." \
            unless klasses_allowed.is_array_of?(Class)
        elsif klasses_allowed.kind_of? Class
          klasses_allowed = [klasses_allowed]
        else
          fail ArgumentError, "Class or array of classes expected, #{klasses_allowed.class.name} given"
        end
        return true if self.empty?
        self.map(&:class).uniq.reject{ |klass| klasses_allowed.include?(klass) }.empty?
      end
    
    
      # @note Sums array members.
      #
      # @return [nil] If source array contains non-numeric values.
      # @return [Fixnum, Integer, Float]
      def sum
        return nil unless self.is_array_of? [Integer, Float, Fixnum]
        self.inject(0) { |sum, value| sum + value }
      end
    
    
      # Boil down values proportionally, to make their sum equal to <tt>target_sum</tt>.
      #
      # @param [Fixnum] target_sum
      # @return [Array] Array of pairs [old value, new_value].
      def reduce_to_sum(target_sum)
        current_sum = self.sum
        gap = current_sum - target_sum
        if gap < 0
          return nil
        elsif gap == 0
          return self.collect { |value| [value, value] }
        else
          reduced = 0
          result = self.collect do |value|
            x = (gap * value) / current_sum # Floats round here
            reduced += x
            [value, value - x]
          end
          # Second pass, as target sum is not reached yet due to rounding of floats
          (gap - reduced).times { |i| result[i][1] -= 1 }
          result
        end
      end
    
    end; end
    
    
    if defined? Array
      Array.class_eval do
        include CoreExt::Array
      end
    end

    https://github.com/gorodulin/assemblr/blob/master/lib/core_ext/array.rb

    Запостил: cancerogen, 27 Мая 2016

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

    • Для меня любой код на Ruby выглядит как говнокод. Я вообще не понимаю как можно работать с таким синтаксисом. Brainfuck и то логичнее.
      Ответить
      • Да, я тоже не понимаю как можно работать с таким синтаксисом. Это же чистое удовольствие, а не работа.

        А автор да, упорот. Вообще среди рубистов уж очень много говнокодеров в инете, видимо синтаксис развращает. Особенно запомнилось когда какой-то рубист спрашивал на SO как определить что все числа в массиве равны, вариант сравнить с первым ему в голову не пришел, зато всяких reduce и reject в избытке.
        Ответить
        • А если вы все рубисты такие умные, то почему проектов на руби вме меньше?
          Ответить
          • Быстро старятся же.
            Ответить
            • нет, правда

              руби симпатичный, его сообщество породило много хороших практик, там всякие континиус деливери, девопсы, rake, bdd, cocoa pods, chief, puppet. много чего


              почему же он в срне гвн скатился?
              Ответить
              • Я думаю что низкий порог вхождения виноват. Хотя в целом мне пофиг на чем там сайты пишутся, сам язык никуда не девается и в говно не скатывается, меня он вполне устраивает.
                Единственный вред который я видел от его веб-ориентированности - разработчики рубиниус даже не сочли нужным его под винду собирать, мол все равно среди них нет никого кто им под виндой пользуется. В итоге ололо-быстродействие и llvm только под линуксом.
                Ответить
                • А зачем руби под виндой? Вагрант в помощь же
                  Ответить
                  • Я то на нем игоры и скрипты пишу, нафиг мне виртуальная машина. К счастью, все годные гемы это понимают и винду поддерживают.
                    Ответить
                • Питон тоже ебаное прыщеговно,рабочего гуникорна под виндой тоже нет.
                  Ответить
                  • Потому что сигналов нет:)
                    Я запускал apache + mod_wsgi под винду вместо гуникорна и работало, как часы.

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

                1 его ниша прочно занята питоном
                2 коммерческое использование рубей сводится рельсам, где таким MVC (и даже лучше) полным полно
                3 Матц перемудрил и придумал концепцию наименьшего удивления при условии, что ты знаешь язык. Хотя с одной стороны это имеет смысл (посмотрите на жс с его подводными камнями)
                Ответить
                • Ну вот почему питон занял? Они же вместе начинали!
                  Ответить
                  • потому что питорасты и выгвидки. Питон проще чем руби, вот школьниге и набижале
                    Ответить
                • Почему нишу перла занял не родственный ему руби, а питон?
                  Ответить
                  • Рубин-на-рельсах разве не попал в нишу? Имхо ещё как попал...
                    Ответить
                    • попал, но как-то стал там буксовать

                      в 2008м году про него говорили буквально все. А теперь процент его как-то очень сильно упал
                      Ответить
                    • В нишу администрирования? А хуй там.
                      Ответить
                      • очень даже

                        еще раз: chief, puppet
                        Ответить
                        • Почему все норовят писать шкриптики на путхоне?

                          > chief, puppet
                          Кто такие?
                          Ответить
                          • Я тебе тока что привел пример двух неебических инфраструктур на рубях, а ты опять при питон)

                            Я не знаю поцчему питон выпёздывает руби. Может быть потому что явное лучше неявного. Может быть потому что хорошо портируется и ембеддится. Может быть потому что приятнее читать код когда есть один (а не двадцать один) способ сделать это. Может быть потому что пистон имеет огромный научный библиотек, всякиий там сайпай, пандас, вот это всё. Может потому что его гугол любит. Хз
                            Ответить
                          • >>Кто такие?
                            одни из первых популярных систем для управления инфраструктурами

                            их пиарили еще в эпическом "континиус деливери", на них девоспы дрочат

                            у питона тоже есть salt и fabric, просто рубийное сообщество было авангарде автоматизации
                            Ответить
                            • Я вообще-то имел в виду написание шкриптиков падсибя.
                              Ответить
                • > концепцию наименьшего удивления
                  Какой скучный язык. То ли дело кресты. Больше 10 лет с ними работаешь, а всё ещё удивляешься.
                  Ответить
                  • так аффтар так именно и грил: дескать я 10 лет работаю с крестами и 10 лет удивляюсь
                    Ответить
        • len(set(list)) == 1?

          Да, хочется чего-то эдакого, а не писать унылый цикл.
          Ответить
          • Ну типа того, только у тебя очень просто, нужна интрига. Вот этот вопрос.
            http://stackoverflow.com/questions/35295181/equality-test-on-three-or-more-objects
            Ответить
            • [a, b, c, d].uniq.length.one?

              Хуясе, у них есть специальный метод, чтобы проверить, равно ли число одному?
              Ответить
              • Это extension method
                Ответить
                • Ну он в инте хранится?
                  Ответить
                  • В руби можно дописать метод к чему угодно. Что к числам вообще, что к инту, что к конкретной единичке.
                    И рельсы таки дописывают методы к чему угодно, чтоб можно было поидиоматичнее с единицей сравнить.
                    Ответить
                    • Ну так это в рельсах искаропки?
                      Ответить
                      • да
                        Ответить
                        • Они не охуели добавлять метод для проверки на единицу?
                          Ответить
                          • А вообще что-то я не вижу этого метода. Так что походу его и нет там.
                            Ответить
                            • http://ic.pics.livejournal.com/nnissann/69033868/34312/34312_600.jpg
                              Ответить
            • arrays.reduce(:&) ? true : false

              Это че за лол?
              Ответить
              • В первой строчке он делает массив из массивов [ [a], [b], [c], [d]], а во второй применяет reduce c оператором &, который для массивов возвращает пересечение. Соответственно [1] & [1] вернет [1], а [1]&[2] вернет [].
                Ответить
                • В смысле в руби нет функции bool()? Или на худой конец len()?
                  Ответить
                  • В руби false значения всего 2 - nil и сам false
                    Ответить
                    • Ну и лохи

                      Говорю как любитель objC
                      Ответить
                    • Что такое false значение? Для которого bool(x) == False?
                      Ответить
                  • есть, но на фоне всего остального этот boolshit мне кажется почти нормой.
                    Ответить
      • >> Для меня любой код на Ruby выглядит как говнокод

        Говнокод != говно

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

        Говнокод - понятие логическое. Что бы понять, кто код является говнокодом, нужно понять что он делает и что именно в нем не так
        Ответить
        • Говнокод <> говно
          Ответить
          • в моноид над каким множеством и какой операцией входят говнокод и говно?
            Ответить

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