Ruby pro zkušené

V rukou experta se Ruby stává mocným nástrojem ve kterém lze stejně lehce psát webové aplikace a skripty, jako vytvářet DSL. Tento jednodenní kurz je určen pro zkušené programátory, kteří chtějí rychle proniknout pod povrch Ruby a sami by si na to nenašli čas.

1 den | | ruby expert DSL

Právě teď nejsou naplánované žádné termíny školení 'Ruby pro zkušené', ale rád nějaký připravím. Stačí napsat!


Úvod

Řekneme si krátce, jak Ruby vzniklo, jaká je jeho filozofie a bez velkých okolků si hned něco zkusíme. Přes aritmetické operace se dostaneme až k proměnným a logickým hodnotám.

$ irb
> x = 1 + 1
=> 2
> x == 3
=> false 

Základní datové typy

Data se v Ruby uchovávají v různých strukturách a my se budeme během celého kurzu postupně seznamovat s těmi hlavními: String, Integer, Symbol, Array, Hash, Regexp, Date, Time. Probereme textovou interpolaci a základní operace s textem.

> name = 'Jack'
=> "Jack"
> "Hello #{name}!".upcase.reverse
=> "!KCAJ OLLEH" 

Operátory a řídící příkazy

Jako každý imperativní jazyk, i Ruby potřebuje řídící příkazy if, else, while, case, when. Má ale i některé méně obvyklé, jako je unless.

return unless x < 10**4

if x > 20
  puts x -= 1  while x > 20
end 

Metody

Kód, který potřebujeme na více místech programu, je dobré uložit do metody, nebo bloku. Prozkoumáme, jak spolu tyto konstrukty souvisí a kdy který použít.

def list_ruby_files
  Dir["*.rb"].each do |path|
    puts path
  end
end 

Cykly

Rubyfor cyklus, ale většinou se na průchod polem používá metoda each s blokem jako parametrem a stejným vzorcem se řídí i další 'funkcionální' metody: map, all?, any?, collect, inject, join, compact, select, find, ...

%w( dog cat elephant ).each do |a|
  puts "#{a} is an animal."
end

(5..10).reduce(:+) 

Základy OOP

Ruby je objektově orientovaný jazyk. Naučíme se vytvořit novou třídu a vysvětlíme si dědičnost a použití modulů. Zkusíme si monkey-patching, tedy úpravu již hotového kódu knihovny.

class String
  def palindrome?
    str = self.gsub /\s/,''
    str == str.reverse
  end
end 

Duck typing

Proměnné v Ruby nemají pevně daný typ. Je to výhoda, nebo nevýhoda? Co všechno nám to umožňuje a na co si naopak musíme dát pozor? Představíme si metody #respond_to? a #method_missing.

if a.respond_to?(:sum)
  a.sum
else
  puts "Cannot sum #{a.inspect}"
end 

Práce s konzolí, debugování, introspekce

Od jednořádových příkazů přejdeme ke skriptu. Naučíme se, jak program zastavit a prohlížet zevnitř, jak rychle vyhledat zdrojový kód knihovny. Řekneme si něco o Pry gemu.

[ 1, 3, 5, 8 ].each do |i|
  puts i
  binding.pry
end 

Užitečné knihovny

Naučíme se pracovat s Rubygems a Bundlerem. Stručně si představíme některé zajímavé gemy, třeba Nokogiri, ActiveSupport a Sinatra.

source 'https://rubygems.org'

gem 'rails', '~> 5.1.0.beta1'
gem 'slim'
gem 'nokogiri' 

Výjimky

Výjimky jsou v moderních jazycích běžný způsob na ošetřování chyb a Ruby není výjimkou (pun intended). Naučíme se je 'vyhazovat' i 'chytat' a řekneme si, proč často není ten nejlepší nápad napsat jen rescue.

begin
  puts open('http://www.google.com').read
rescue SocketError
  puts 'Connection Failed'
end 

Práce se soubory

Naučíme se i číst a psát. Tedy ze souboru.

f = File.new('/etc/passwd')

f.each_line do |l|
  user = l.split(/:/).first
  puts user
end 

A když zbyde čas...

Je toho spousta, co můžeme v Ruby zkusit. Metaprogramování, psaní vlastních DSL a nebo si uděláme jednoduchou webovou aplikaci. Záleží jen na zájmu a preferencích účastníků. Fantazii se meze nekladou!

Školení je vždy ušito na míru účastníkům. Něco vynecháme, něco přidáme a nakonec protřepeme a zamícháme. Ruby ale vždy zůstane.