2. Ruby Wstęp
Kim jestem?
Kim są słuchacze?
Po co ta prezentacja?
Zainteresować językiem Ruby
Pokazać prostotę i możliwości
Objaśnić jak zacząć przygodę
2
3. Ruby Plan
I. Rekonesans
II. Pierwszy dotyk
III. wRubyWstąpienie
Konstrukcje składniowe
Typy wbudowane
IV. Coś większego
V. Postludium
3
5. Ruby Ruby? A co to takiego?
Wzór chemiczny
Al2O3:Cr+3
Gęstość
3,95 do 4,1 g/cm3
Barwa
czerwona o różnych
odcieniach i różnym stopniu
nasycenia; niekiedy wielobarwny
Rubin Luminescencja
wyraźna, nadaje
minerał rubinom szczególnego
z gromady tlenków kolorytu, podwyższając ich
walory estetyczne.
5
6. Ruby Powstanie
Twórca:
Yukihiro Matsumoto [Matz]
Czas powstania: rok 1995
Popularna wersja: 1.8.7
[czerwiec 2008]
Najnowsza wersja: 1.9.1
[styczeń 2009]
Czekamy na Ruby 2.0 6
7. Ruby Cechy
Interpretowany
[chociaż są kompilatory just-in-time]
Obiektowy
Dynamicznie typowany
Automatyczne zarządzanie pamięcią
Podobny do: Python, Smalltalk, Perl,
Icon
Nie posiada specyfikacji! 7
8. Ruby Implementacje
Ruby MRI – Matz's Ruby Interpreter
[implementacja referencyjna]
YARV – Yet another Ruby VM
[standard od wersji 1.9]
JRuby – implementacja w Javie
XRuby – kompilacja do Java bytecode
IronRuby – implementacja w .NET
MacRuby – implementacja Apple'a
8
Rubinius
10. Ruby Piszesz - masz
for x in 5..15
print x2
end
'dzień dobry' include 'dobry'?
'abecadło' each char do c
print c,capitalize
end
100 times do
print Będę mówił 'rubi', a nie 'rabi'!
end
10
11. Ruby Piszesz - masz
for x in 5..15
print x**2
end
'dzień dobry'.include? 'dobry'
'abecadło'.each_char do |c|
print c.capitalize
end
100.times do
print "Będę mówił 'rubi', a nie 'rabi'!"
end
11
15. Ruby Obiektowość
Wszystko jest obiektem
… nawet nil
… nawet klasa [instancja klasy Class]
“Class is an object, and Object is a
class.” [Hal Fulton]
Wszystko jest wyrażeniem i zwraca
wartość
Wszystko oprócz nil i false jest 15
prawdą
16. Ruby Zmienne i stałe
Zmienne
od małej litery lub znaku _
słowa oddzielone znakiem _
Stałe
od dużej litery
CamelCase
Zmienne globalne
od znaku $
Symbole
od znaku : 16
17. Ruby Komentarze
jednolinijkowe
# Jednolinijkowy komentarz
wielolinijkowe
=begin
Ten komentarz nie wnosi
nic konstruktywnego
poza zajęciem czasu czytelnika.
=end
17
19. Ruby Operatory
arytmetyczne
+ - * / % **
przypisania
= += -= *= /= %= **= |= &= >>= <<=
||= &&=
porównania
== .eql? .equal? != < > >= <= <=> =~ !~
logiczne
&& || ! and or not
bitowe Nie ma operatorów ++ i --
~ | & ^ << >>
inne
19
[] []= .. … ! not
20. Ruby Operatory
==, .eql?, .equal?
5 == 5.0 # => true
5.eql? 5.0 # => false
5.equal? 5.0 # => false
5.equal? 5 # => true
'a' == 'a' # => true
'a'.eql? 'a' # => true
'a'.equal? 'a' # => false
|| oraz or, && oraz and – różnica w priorytetach
a = false or 5 # => 5, a = false
a = false || 5 # => 5, a = 5
20
21. Ruby Operatory
||=
a = a || "default value"
a ||= "default value"
wielokrotne przypisanie
a, b = b, a
a, b, c = get_something
21
22. Instrukcje
Ruby
warunkowe
if … [elsif …] [else …] end x = if a > 5
100
elsif a > 100
puts 'miliard!'
10**9
else
1
end
… if …
puts 'miliard!' if a > 100
unless zamiast if not
22
23. Instrukcje
Ruby
warunkowe
… ? … : ...
x = a > 100 ? 'miliard!' : 'mało'
case … when … [else ...] end
x = case x
when 0...5
1
when 5..100
50
else
'miliard!'
end
23
24. Ruby Pętle
while … [do] … end
while a > 10
a /= 3.0
end
… while …
puts "Iteracja nr #{i+=1}" while i < 10
until zamiast while not
24
25. Ruby Pętle
for … in … [do] … end for i in 1..8
puts i
end
break
next
redo
retry
metody na obiektach typu Integer
times
upto
25
downto
26. Ruby Metody
wywołanie invoke_method
invoke_method()
wywołanie z argumentami invoke_method a, b, c
invoke_method(a, b, c)
wywołanie z wykorzystaniem wartości zwracanej
a = invoke_method(a, b, c)
puts invoke_method(a, b, c)
nawiasy opcjonalne
… ale zalecane, bo:
one_method 5, another_method 10, 100
26
27. Ruby Metody
definiowanie
def something_interesting
first_statement
second_statement
third_statement_will_return_sth
end
return opcjonalne
… chyba że nie jest ostatnią instrukcją
def something_interesting
return false if $SthWrongHappened
second_statement
third_statement # will return sth unless $SthWrongHappened
end
27
28. Ruby Metody
definiowanie z argumentami
def something_interesting(a, b, c)
...
end
argumenty domyślne
def something_interesting(a, b = true)
...
end
lista argumentów
def something_interesting(a, *other_args)
...
end 28
29. Ruby Metody - konwencje
Bang methods
zakończone znakiem !
potencjalnie 'niebezpieczne'
np. modyfikują obiekt 'w miejscu'
najczęściej posiadają odpowiedniki niemodyfikujące,
które produkują nowe obiekty
np. sort!, upcase!, reverse! w kolekcjach
Metody 'pytające'
zakończone znakiem ?
najczęściej zwracają true lub false
np. empty?, include?, nil? 29
30. Ruby Klasy
class … end class Miliard
puts "Ładowanie..."
nazwa od dużej litery
wewnątrz definicje metod attr_reader :value
… oraz instrukcje def initialize(value)
@value = value
metoda initialize
end
metoda inspect
def introduce_yourself
zmienne instancji puts "Wartość: #{@value}"
od znaku @ end
zmienne klasy def value=(v)
od znaków @@ @value = v if v > 100
end
własne akcesory end
30
akcesory attr_reader, attr_writer, attr_accessor
31. Ruby Klasy
metoda instancji class Document
def send_to(email)
konwencja: ...
end
Klasa#metoda
end
d = Document.new
d.send_to('darth@vader.gov')
class Document
metoda klasy def self.read_from(filename)
...
konwencja: end
Klasa::metoda end
d = Document.read_from('dok.txt')
31
32. Ruby Klasy
klasy nigdy nie są zamknięte!
można rozszerzać i modyfikować istniejące
… również wbudowane :)
class String
def inspect
"Ukryta wartość"
end
def starts_with_capital?
('A'..'Z').include?(self[0, 1])
end
end
32
pojedyncze obiekty też są otwarte!
33. Ruby Klasy
poziomy dostępu metod def SomeClass
def some_public_method
public end
protected
protected
private def some_protected_method
end
private
def some_private_method
def SomeClass end
public :sth_public end
protected :sth_protected
private :sth_private
def ...
...
end 33
34. Obiekty jako
Ruby
odbiorcy metod
każda metoda jest 'wysyłana' do obiektu
send
"abc".send("capitalize")
method_missing
class Miliard
def method_missing(method_id)
puts "Nie mam metody #{method_id}!"
end
end
34
35. Ruby Moduły
tworzą przestrzeń nazw
module ComputingMachine
PerformanceUnit = 'FLOPS'
def ComputingMachine.play_chess
...
end
end
puts ComputingMachine::PerformanceUnit
ComputingMachine.play_chess
mogą zostać włączone do innego modułu lub klasy
35
36. Ruby Mixins
include module DebugAbility
można włączyć def error_info
"Something bad happened..."
kilka modułów end
nie można stworzyć end
hierarchii class Miliard
include DebugAbility
...
end
puts Miliard.new.error_info
36
37. Ruby Dziedziczenie
tylko jednobazowe class Miliard
def introduce_yourself
hierarchia klas puts "Miliard!"
Object – korzeń end
end
polimorfizm
class LepszyMiliard < Miliard
self
def introduce_yourself
super super
puts "Lepszy Miliard!"
zmienne instancji end
nie są związane
def to_s
z klasą, ale z obiektem "Lepszy Miliard!"
end
end
37
38. Ruby Bloki
smaczny kąsek
do … end 10.times do |i|
puts i
end
{…} 10.times { |i| puts i }
są przekazywane do metody
yield def give_me_something
sth = rand.to_s
yield(sth)
end
give_me_something { |x| puts "I've got #{x}!" }
38
39. Ruby Wyrażenia lambda
bloki nie są obiektami...
… ale mogą się nimi stać :)
klasa Proc
metody lambda i proc
miliard = lambda { puts "Miliard!" }
miliard.class # => Proc
miliard.call # => "Miliard!"
nie można przekazywać metod do innych metod...
… ale można przekazywać obiekty klasy Proc
metoda nie może zwrócić innej metody...
39
… ale może zwrócić obiekt klasy Proc
40. Ruby Wyjątki
przechwytywanie – rescue, ensure
begin
dangerous_method
rescue IOError
puts "Oh, no! IO Error!"
rescue AnotherException => e
puts "Dunno what happened 0_o", e.message
ensure
# here we enter always
end
można też objąć całą metodę def some_method
dangerous_method
rescue
puts "Oh, no! Error!"
end 40
41. Ruby Wyjątki
rzucanie - raise
def dangerous_method(arg)
raise 'Invalid argument' unless arg
raise ArgIsZeroError, 'Arg is zero' if arg == 0
...
end
dziedziczą po klasie Exception
domyślnie RuntimeError
41
44. Ruby Łańcuchy tekstowe
klasa String
mutowalne
ograniczone znakami ' lub "
specjalne, ograniczone znakami `
wykonywane przez system operacyjny
#{ … } - tylko gdy " [string interpolation]
escape sequences – od znaku
bogaty zestaw metod
do wersji 1.8 nie obsługują natywnie Unicode'u :(
44
… ale w 1.9 już tak :)
50. Ruby Pliki
klasa File File.open('plik.txt') do |file|
while line = file.gets
puts line
end
end
File.open('plik.txt', 'w') do |file|
file.puts "Miliard!"
end
klasa Find
Find.find(ENV["HOME"]) do |path|
puts "Katalog: #{path}" if File.directory?(path)
end
50
51. Ruby Marshalling
czyli serializacja
klasa Marshal
dump
load
sth = [3, {:a => 2}, "koniec"]
File.open('file.dat', 'w+') do |f|
Marshal.dump(sth, f)
end
File.open('file.dat') do |f|
@sth = Marshal.load(f)
end
51
52. Ruby Wątki
klasa Thread
współdzielą zmienne globalne i lokalne spoza bloku
zmienne lokalne mają na wyłączność
Thread.list
Thread.current
100.times do |i|
Thread.new(i) do |j|
puts "sqrt(#{j}) = #{Math.sqrt(j)}"
end
end
do wersji 1.8 nie były natywne :( 52
… ale w wersji 1.9 już tak :)
53. Ruby Sockets
klasy: server = TCPServer.new('localhost',
12345)
BasicSocket loop do
IPSocket Thread.start(server.accept) do |s|
TCPSocket s.write("Miliard!")
SOCKSSocket s.close
TCPServer end
UDPSocket end
Socket
UNIXSocket
UNIXServer client = TCPSocket.new("127.0.0.1",
12345)
puts client.readline
client.close
53
55. Ruby Więcej!
RubyGems – rubygems.org
gem install
gem list
RubyForge – rubyforge.org
● RubyForge is a home for open source Ruby projects
55
56. Ruby Jeszcze więcej!
Web frameworks
co najmniej 10, m.in:
Ruby On Rails
Merb
Coś do baz danych
DataMapper
Sequel
Coś do testów
● Test::Unit [w bibliotece standardowej]
RSpec
Ruby bindings for OpenGL and GLUT
RMagick
wxRuby
56
… i mnóstwo innych!
57. Ruby Róża bez kolców?
wątki realizowane w obrębie VM [nieaktualne od 1.9]
brak wsparcia dla Unicode'u [nieaktualne od 1.9]
średnia wydajność [ale 1.9 około 2 razy szybszy niż 1.8]
brak specyfikacji
łatwy monkey patching
57