Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Ruby: cheatsheet для постижения. Часть 1

Anna | 20.06.2014 | нет комментариев

Еще когда учился в школе, и интересовался языками, я считал, что необходимо приобретать две книги по любому языку: первую — «для чайников» и вторую — «мастер». В первой необходимо было прочитать все hints — а остальное пролистать, а вторая — настольная (теперь ее заменил Google). И подход абсолютно работал. Сейчас, с становлением интернета, такой формат куда-то улетучился, и при независимом постижении необходимо по крупицам собирать данные — все материалы либо теснее «pro», либо напротив — азы, без «самого сока» и многих на практике значимых пророческой, либо же — все сразу и в кучу на >9999 страницах.

Это — статья-roadmap-cheatsheet для постигающих Ruby и Rails (Rails и Gems намечены на вторую часть). Взамен того, Дабы рассказывать следующий how-to я постараюсь расписать все те вещи, которые, на мой взор, дозволено высказать коротко и емко, с упором на то, что программисту пришедшему с других языков и платформ может показаться не явственным, антипоисковым и проcто затратным по времени на постижение без подсказок — на остальное легко дам ссылки (и есть Google — но чай не неизменно, исключительно в начале пути, видимо что у него необходимо спрашивать). Не смотря на то, что в природе существует уйма туториалов/кастов/книг/чего желательно по чему желательно — именно такого формата мне самому неизменно не хватает. И по сути, это те вещи, которые Почаще каждого рассказываю при вопросах «а как оно вообще?», «с чего начать?», «а как делается такая вот штука?», «а какой gem отменнее?» — сейчас буду кидать ссылку сюда) Кстати, пока работал над этой статьей на Прогре возникла схожая про Python — видимо, идея витает в воздухе.

Около Ruby – сплетни, интриги, расследования

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

Язык программирования — это не только синтаксис, сборщик мусора, не только парадигма языка, и даже не столько его философия, в первую очередь — это коммьюнити и та кодовая база, которую это коммьюнити сделало. Исключительно теперь, в эру OpenSource. И здесь у Ruby 1-й толстый плюс в карму. Одна из особенностей — во каждому читается прагматичная лень, начиная c опциональности скобок при вызове способов и точек с запятой в конце строки, продолжая емким и колоритным синтаксисом, и заканчивая всеобщим ощущением от планов — многие из них сделаны работающими из коробки, и требующих минимальных усилий, Дабы сконфигурировать их.

Многие выбирают Ruby, потому что это удобно и славно. Наслаждение и веселье от программирования дозволено получить на различных языках — и в Ruby оно схоже на езду на отличном авто. Не на суперкаре, подвеска которого пересчитывает всякую колдобину, но но все вокруг в фуроре, не на вседорожнике, на котором если внезапно приспичит дозволено помесить грязища, не на «зажигалке», Дабы со всеми гоняться с перекрестка, и не малолитражке (но дешево и экологично) — именно на отличной достойной машине, сидя за рулем которой будешь думать не столько о дороге, сколько о больше значимых вещах, правда бы о маршруте и финальной цели поездки. И слушать любимую музыку, безусловно.
Либо же, дозволено сказать, что программирование на Ruby схоже на игру в Lego (и это во многом вследствие Gems). Правда кто-то любит сварку арматуры, а кому-то довольно картона и клея.

Но аналогии аналогиями. Есть несколько заявлений, которые изредка дозволено встретить о Ruby и Rails — испробую внести в них ясность.

Вестимо заявление о том, что Ruby неторопливый. И поспорить трудно, чай Ruby интерпретируемый язык. И что свойственно, Почаще каждого я это слышу от тех кто пишет (экстраординарно) на PHP, тот, что тоже интерпретируем, и по скорости в синтетических тестах находится приблизительно на том же ярусе. Скорее каждого, это отголоски дрянный славы ветхих версий. По факту, мне доводилось трудиться и с Rails и с Symfony2 — на реальных приложениях Rails стремительней при идентичном ярусе оптимизации (и в обоих верное кэширование — залог триумфа). Если необходима скорость и компактность в памяти — пишите на ассемблере используйте Node.js. Но парадокс в том, что на нем как раз Зачастую пишут рубисты — когда это подлинно обоснованно. И дело здесь вот в чем: главна не только скорость работы, но и скорость написания приложения. И Ruby, и все то, что дозволено обнаружить на github различно помогает достичь подлинно высокой продуктивности программиста — в том числе и в вероятностях оптимизации приложения. И не необходимо забывать, что и основная нагрузка, и бутылочные горлышки, нередко — это базы данных, а веб-приложения это каждого-лишь прослойка бизнес-логики. А такая прослойкн оказывается завернут его в класс Proc.
В разделе про классы и способы они теснее применялись:

Foo.instance_eval do # передаем в способ instance_eval блок с определением способа
  def baz; bar   1 end
end

Но возьмем больше базовый пример, он же «как сделать foreach в Ruby»:

[1,2,3].each do |val|
  p val # кстати, p(val) - это shortcut для puts(val.inspect)
end # выводит 1 2 3

# то же, в одну строчку 
[1,2,3].each { |val| p val } # выводит 1 2 3
[1,2,3].each_with_index { |val, i| puts val.to_s   ' '   i.to_s } # на заметку

Если же мы хотим передавать блок в личный способ:

def foo
  puts yield # 2; исполняем блок
  puts yield   yield # 4; и еще, и еще исполняем
end
foo { 2 }
def bar(&block) # либо, если поменьше пудры
  puts yield block # 3
end
bar { 3 }

Стоит подметить, что блок идет неизменно последним параметром, и если необходимо передать несколько блоков — необходимо их передавать как обыкновенные параметры, а значит создавать Proc.new, либо lambda.

Из блока неизменно получается объект класса Proc, но сам блок это часть синтаксиса: мы можем его передать в способ, где он станет Proc, мы можем его передать в конструктор Proc, либо применять lambda, но невозможно легко записать блок в переменную.

proc = Proc.new { |a| a - 1 } # через конструктор
p proc.call(10) #9
p proc.class # Proc
l = lambda { |a| a   1 } # создаем лямбду
p l.call(10) #11
p l.class # Proc
new_l = ->(a) { a   2 } # тоже лямбда (Ruby >= 2.0)
p new_l.call(10) #12

Отличия в поведении Proc сделанными различными методами есть, читаем статью.
Тут замыкания и блоки в Ruby разобраны по и попрек
На Прогре про блокипро замыкания

Жанр

По поводу как принято писать в Ruby есть целый гайд на GitHub
Лаконично, frequently used:

  • Отступы в 2 пробела
  • Наименования способов строчными буквами через подчеркивание: def method_name
  • Наименования классов и модулей с крупных букв: class ClassName
  • Если способ возвращает true/false, наименование должно заканчиваться на вопрос (тот же, nil?)
  • Если есть два способа, один из которых изменяет объект, а иной возвращает новейший — 1-й оканчивается на ‘!’ (скажем, способы downcase и downcase! для строки — 1-й вернет новую, а 2-й изменит саму строку)
  • Взамен if(!value) отменнее применять алиас unless(value)
  • Блок однострочный берется в скобки {… }, а многострочный — в do… end

RubyGems – пакетный администратор

Мир Ruby, вероятно, был бы вовсе иным, если бы не RubyGems.
С ними процесс дополнения плана библиотеками выглядит дюже легко:

  • выбираем что нам необходимо с rubygems.org (либо через ruby-toolbox.com), скажем, json_pure — JSON парсер на чистом Ruby (без C)
  • вводим в консоли gem install json_pure
  • а в нашем rb-файле:
    require 'json/pure' # какой именно путь должен быть стоит в доках посмотреть, традиционно на github

Для комфорта управления зависимостями есть bundler:

  • gem install bundler
  • bundler init
  • в появившемся Gemfile вписываем зависимости:
    source 'https://rubygems.org'
    gem 'json_pure'
    
  • bundler install
  • И в своем rb-файле
    require 'rubygems'
    require 'bundler/setup'
    

В реальных планах список зависимостей может разрастись на несколько экранов, следственно при переносе плана на сервер значительно комфортнее исполнять bundle install, чем вручную глядеть что необходимо и для всякого гема исполнять gem install. Ну а в Rails bundler применяется из коробки.

Сами Gems непременно разгляжу в статье про Rails.

Ruby и C

Вдалеке не последняя по значимости вероятность RubyGems — Native Extensions. Все легко — совместно с гемом может быть скомпилирован прилагающийся код на C и вызван из кода самого гема. Вследствие этому, среди них есть довольно юркие парсеры, дозволено установить JavaScript’овый V8 в виде гема, и много других вкусностей.

А это необходимо легко иметь ввиду: Inline C, может сгодится. Если коротко — в коде Ruby дозволено исполнять код на C, что благотворно, скажем, при реализации численных алгорифмов.

Вступление в растяжения Ruby на C

Зоопарк версий

MRI (Matz’s Ruby Interpreter) — основная ветка Ruby от его создателя Yukihiro Matsumoto, либо легко, Matz. Реализована на C. Когда легко говорят «Ruby» традиционно имеют ввиду ее. Начиная с версии 1.9 объединена с планом YARV (Yet another Ruby VM). Одна из основных ее особенностей — так называемый GIL (Global Interpreter Lock), на Прогре про нее писали (с продолжением). Теперь актуальная версия Ruby 2.0. Чего нам ожидать от Ruby 2.1?

jRuby, тот, что написан на Java и работает в JVM, и соответственно интегрируется с кодом на Java. К сожалению, версия языка отстает от MRI (теперь реализован Ruby 1.9.3), но тот же Rails заводится на нем с пол цикла.

Rubinius, тот, что основан на MRI, но использует потоки операционной системы, а так же по максимуму написан на самом Ruby. По версии традиционно up do date.

Скорость всех 3 реализаций касательно друг друга разнится от задачи к задаче, а по потреблению памяти из троицы самый прожорливый — jRuby.

MacRuby — он теснее стоит на вашем MacBook и работает в связке с Objective-C. Его, к примеру, используетRubyMotion — инструмент для разработки iOS приложений.

Opal — транслятор Ruby в JavaScript. Но не нужно ожидать от него чего-то выдающегося, это не jRuby для Node.js — он легко дает вероятность писать ваш jQuery-код на Ruby.

Ruby Enterprise Edition (REE) — Ruby на стероидах. План закончил свое существование, т.к. новые версии и без наркотиков недурно бегают.

Дозволено упомянуть MagLev — специфическая версия, может сгодится для разворачивания облачной инфраструктуры.

Также увлекателен план mruby, в котором участвует Matz. Это — встраиваемый Ruby. План еще не завершен, но крайне многообещающе выглядит. Так что, ожидаем ruby на Arduino. mruby-arduino. На нем же основанMobiRuby, предуготовленный для разработки мобильных приложений.

Ну и на закуску, KidsRuby, по смыслу напоминающий старичка Logo.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB