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

    −143

    1. 1
    2. 2
    3. 3
    4. 4
    [23:16:22] Adam: sorry roles is
    Role.all.each do |r|
    	@roles << r.name.gsub(/_/,' ').split.map(&:capitalize).join(' ')
    end

    Американец пробовал вывести массив типа такого ["Student", "Admin", ....] )))

    Запостил: tetssuwan, 05 Июня 2014

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

    • В чем говно то? each на map не заменишь, раз в каждом элементе может быть несколько разделенных подчеркиванием.
      Ответить
    • Одноразовый кусок кода в переписке. Я и не такое могу наговнокодить в девелоперской консоли.
      Ответить
    • в руби даже говно специфическое... вроде как с первого взгляда похоже на потуги на ФП, но нет - все равно все через ж.
      Ответить
    • Тут главное говно в том, что роли хранятся в тексте. Неужели енум нельзя было завести? и да, джойн явно лишний
      Ответить
      • @roles = Role.all.inject([]) {|out,r| out << r.name.split(/_/).each{|x|x[0]=x[0].upcase;x}}

        Или я рубинуб
        Ответить
        • > inject([])
          GOATSE

          P.S. А что делает inject?
          Ответить
          • собирает в аккумулятор

            puts [1,2,3,4,5].inject(0){|sum,x|sum+x}

            >>15

            fold короче
            Ответить
            • Опять эти традиции в руби. reduce и inject в документации нашёл, странно, что fold отсутствует.
              Ответить
              • Всмысле foldl отсутствует? Вот же он судя по параметрам и результатам
                Ответить
                • Отсутствуют методы с именами fold*. Если в ruby есть map и collect, делающие одно и тоже, есть reduce и inject, делающие одно и то же, то почему бы и fold* не запилить?
                  Ответить
            • {|sum,x|sum+x}
              Это такая стремная лямбда чтоли? Зачем такой неадекватный синтаксис? Хотя я подозреваю они просто хотели упростить парсинг, потому что стандартный вроде как посложнее может быть.
              Ответить
              • Лямбды, блоки кода, ...
                Рубисту предлагается на выбор множество лямбдоподобных конструкций с разными смыслами и поведением (это мы ещё класс Method не смотрели):
                {|sum,x|sum+x}
                do |sum,x|sum+x end
                Proc.new {|sum,x|sum+x}
                Proc.new do |sum,x|sum+x end
                lambda {|sum,x|sum+x}
                lambda do |sum,x|sum+x end
                ->(sum,x) { sum+x }
                Ответить
                • Жуть.
                  А можно как-нибудь так?
                  puts [1,2,3,4,5].inject(0)(+)
                  Ответить
                  • Судя по документации (а сам я на руби только пару дней писал),
                    puts [1,2,3,4,5].inject(0, :+) # или
                    puts [1,2,3,4,5].inject(:+)
                    Ответить
                    • Оказывается можно. Я тоже на руби не писал много.
                      Ответить
                • В них же еще return по разному работает... в лямбдах - возвращает управление из лямбды, в блоках - из окружающей его функции.
                  Ответить
                  • А из блока какое значение возвращается? Результат последнего выражения?
                    Ответить
                    • > А из блока какое значение возвращается?
                      Вроде бы да: {|sum,x|sum+x}. Но я не рубист, и руби не люблю. Сталкивался с ним немного, когда возился с рельсами.
                      Ответить
                • do/end - эквивалентны {}, они просто для читаемости (однострочные красивее делать {}, многострочные - do/end).
                  Первое от второго и третьего отличается тем где его можно использовать, т.е. одно вместо другого все равно не напишешь. Второго от третьего да, тонкое отличие есть.
                  Вот последнего синтаксиса не видел, это в Ruby 2.0\2.1 сахар ввели?
                  Ответить
                  • > Вот последнего синтаксиса не видел, это в Ruby 2.0\2.1 сахар ввели?
                    Говорят, в 1.9.1 ввели (это я из http://habrahabr.ru/post/85578/#comment_2630853 взял)
                    Ответить
                • Гибкость во всех проявлениях
                  Ответить
        • все таки немного рубинуб - x[0]=x[0].upcase возвращает х так что ";x" нинужна
          Ответить
        • А толку? Выиграл одну строчку?

          >each{|x|x[0]=x[0].upcase;x}}
          нуб. capitalize как раз это и делает.
          Ответить

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