Статьи

Рубиновые лакомые кусочки

Руби это прекрасный язык. Что делает его таким элегантным, так это наличие безумного количества возможностей, которые уменьшают объем кода, который вам приходится писать.

Есть много этих маленьких кусочков, и иметь дело со всеми из них может быть раздражающим. Однако игнорирование их приводит к дрянному коду, заполненному множеством циклов while, «продолжением» и нарушением модульности.

В этой статье мы расскажем о небольших лакомых кусочках в Ruby (часто о базовых методах), которые сделают вас более продуктивными, если вы сможете их правильно использовать.

Давайте погрузимся в!

Закуска

Одна мантра, которую вы хотите выучить наизусть: «хотя петли могут быть канцерогенами»

Если серьезно, чрезмерное использование циклов while и инкрементных переменных (я смотрю на вас, я) часто делает код Ruby уродливым и раздражающим, чтобы мысленно пройти через него.

Таким образом, я представляю вам «каждый»:

[1, 2, 3, 4, 5].each do |e|
puts e
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Я уверен, что все вы, скорее всего, видели «каждого» в действии и раньше, но важно знать, когда его использовать. Как правило, всякий раз, когда вы пытаетесь использовать цикл while над массивом, вы, вероятно, можете использовать каждый (или один из его двоюродных братьев).

«Каждый» может быть вызван множеством предметов, массивы являются наиболее популярным (спорным). Вы можете передать блок , который будет выполняться над элементами массива.

Точно так же класс Array имеет массу методов, которые принимают блоки и запускают их над массивом. Особенно интересный называется «карта»:

a = [1, 2, 3, 4, 5]
b = a.map do |x|
x = x + 1
end
p b

view raw
gistfile1.rb
hosted with ❤ by GitHub

Как это работает просто — он запускает блок над массивом и возвращает новый массив. В примере мы должны получить результат [2, 3, 4, 5, 6]

Этот пример на самом деле еще более интересен, потому что мы не используем «put», вместо этого мы просто пишем «p», что означает «put». Он не одобряет использование «p» в реальном коде, но при отладке это благословение.

Теперь, что если вы не хотите, чтобы map захотела вернуть новый массив, просто отредактируйте старый на месте? Ну, есть карта! для этого:

a = [1, 2, 3, 4, 5]
a.map! do |x|
x = x + 1
end
p a

view raw
gistfile1.rb
hosted with ❤ by GitHub

Как мы видим, он модифицирует массив на месте.

Рубиновые ветераны использовали карту и карту! чтобы выбраться из многих трудных ситуаций — используйте их в своих интересах.

Струны

Строковая обработка — это то, что большинство разработчиков делают довольно регулярно, потому что между «разделенными пробелами» и «необходимостью писать компилятор» существует большая разница.

Еще раз, цикл может быть проблемой. Если вы обнаружите, что перебираете символы строки, вы, вероятно, делаете что-то не так (в Ruby; в C это то, что вам приходится делать большую часть времени, потому что средства обработки строк в основном не существуют).

Прежде всего, давайте рассмотрим важнейший метод «расщепления»:

def get_words(sentence)
sentence.split(» «)
end
puts get_words(«This is pretty awesome»)

view raw
gistfile1.rb
hosted with ❤ by GitHub

Как видите, у нас есть один метод (get_words), который принимает предложение и возвращает слова. И это делается с помощью метода split

split Довольно просто. Но это становится намного интереснее, потому что мы можем использовать регулярные выражения для определения разделителя.

Метод split становится очень мощным, и его применяют во множестве творческих способов (однако не слишком изобретательны — слишком много регулярных выражений может сделать ваш код настоящим адом для парня, который должен его читать).

Давайте посмотрим на gsub

p «how you doing».gsub(/ /, ‘-‘)
p «john is a great guy».gsub(/john/, ‘dhaivat’)

view raw
gistfile1.rb
hosted with ❤ by GitHub

gsub Везде, где этот образец совпадает в строке, заменяется текстом замены.

Первый вызов gsub Второй звонок говорит: «Дхаиват — отличный парень».

gsub

Конечно, класс String также предлагает gsub! метод, который изменяет строку на месте.

Теперь давайте рассмотрим довольно очевидный; конкатенации:

a = «hello, how are you»
a << » doing today»
p a

view raw
gistfile1.rb
hosted with ❤ by GitHub

Это очень ясно. <<

Наконец, у нас есть match

«hello, world!».match(/o/) do |matched|
p matched
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Метод match Таким образом, в блоке, который мы добавили, места, где шаблон соответствует (в данном случае / o /), передаются в блок. Результат должен быть двумя «о».

Это большая часть методов обработки строк, которые вы будете использовать в Ruby.

То, что вы можете сделать с помощью этого, казалось бы, небольшого набора инструментов, на самом деле удивительно. Фактически, я недавно видел полный HTML-парсер, который использовал только эти несколько методов для 90% кода. Я не говорю, что это хорошая идея для анализа HTML с помощью регулярных выражений (на самом деле, если вам интересно, это довольно ужасная идея), но тот факт, что это возможно только с этими функциями, весьма впечатляет ,

Чтобы попробовать свои силы в этих методах, попробуйте каждый из следующих:

  • Написать анализатор файла CSV
  • Разработайте функцию, которая разбивает предложение на слова с учетом пунктуации
  • Разбирать HTTP-запросы, только используя функции, описанные выше

Последняя проблема уникальна, особенно если вы анализируете и URL-адреса.

маршал

JSON, кажется, сейчас в моде, особенно из-за прямой работы с Javascript. Руби предлагает маршалу, который во многих случаях оказывается отличным выбором.

Маршал действительно простой, но довольно интересный. Marshal.dump

Аналогично, Marshal.load Конечно, существует бесконечное количество комбинаций, которые заставляют его задыхаться, поэтому вам нужно убедиться, что передаваемая вами строка на самом деле была сериализована ранее с Marshal

Где бы это использовать? Конечно, при написании серверов (особенно при работе с RPC или удаленным вызовом процедур) вы можете просто отправить данные, сериализовав их с Marshal Это предполагает, что оба конца связи согласовывают метод сериализации.

Я использовал Marshal Часто, когда вам нужно, чтобы некоторые части вашего приложения говорили, вы можете использовать Marshal Он встроен прямо в Ruby, поэтому вам не нужно беспокоиться о добавлении другой зависимости, которая может быть важна, если ваше приложение будет работать на чужом сервере.

Упражнение, которое нужно попытаться реализовать (а затем никогда не использовать; оно не предназначено для peformant), будет заключаться в создании простой базы данных с использованием только Marshal и текстового файла. Это интересная проблема — попробуйте!

Вывод

Надеюсь, это был интересный ассортимент тем из разных мест в Ruby. Поначалу они кажутся довольно тривиальными, но Ruby использует эти методы снова и снова. Поэтому всем хакерам Ruby важно ознакомиться с ними.