Co nowego w świecie Ruby\'ego3. Luty 1993
Matz zaczyna pracę nad Rubym
Grudzień 1996
Ruby 1.0
Grudzień 2001
“Programming Ruby”
Lipiec 2004
Ruby on Rails
Zdjęcia: Marcin Bajer, Roo Reynolds 6. Wydajność
6
Unicode
Kolekcje
Lambdy i Proce
Fibers
Perełki 9. YARV na ratunek
• Autor - Koichi Sasada
• “Yet Another Ruby VM”
• Merge - styczeń 2007
• Standard od 1.9
Zdjęcie: Marcin Bajer 10. Efekt?
Źródło: The Great Ruby Shootout 13. Gżegżółka?
ﻛﻴﻒ ﺣﺎﻟﻚ؟ • Wiele standardów
kodowania
• String - ciąg znaków,
nie bajtów
• Klasa Encoding
• String < Enumerable
• Rozbudowa API 14. Przykład
!
NEW
> quot;Łukaszquot;.length > quot;Łukaszquot;.length
=> 7 => 6
> quot;Łukaszquot;.reverse > quot;Łukaszquot;.reverse
=> quot;zsaku201305quot; => quot;zsakuŁquot;
> quot;Łukaszquot;[0] > quot;Łukaszquot;[0]
=> 197 => quot;Łquot;
Ruby 1.8 Ruby 1.9 15. Przykład c.d.
!
NEW
> quot;Łukaszquot;[0] > quot;Łukaszquot;[0]
=> 197 => quot;Łquot;
> ?u > ?u
=> 117 => quot;uquot;
> quot;piesquot;[1] > quot;małpaquot;[2]
=> 105 => quot;łquot;
Ruby 1.8 Ruby 1.9 16. Encoding
• Odwzorowanie
bajty znaki
0101101 • Atrybut każdego Stringa
• Standardowe:
ASCII_8BIT, UTF_8,
EUC_JP, SHIFT_JIS
• Narzucenie, konwersja
kodowania 17. Przykład c.d.
# coding: utf-8
# w pliku źródłowym:
quot;Łukaszquot;.encoding # => <Encoding: UTF-8>
quot;Lukaszquot;.encoding # => <Encoding: ASCII-8BIT>
# z zewnętrznego źródła:
text = stream.readline.force_encoding(quot;utf-8quot;)
f = File.open(quot;data.txtquot;, quot;r:utf-8quot;)
# konwersja:
euro = quot;€quot;
euroiso = euro.encode(quot;iso-8859-15quot;)
Ruby 1.9 19. Enumerator
• Klasa
Enumerable::Enumerator
• Proxy dla kolekcji
• Kolekcje z “byle czego”
• Automatyczna konstrukcja
• Zewnętrzne iteratory 20. Przykład
# zwykłe proxy
enum = [1, 2, 3].to_enum
# konkretny iterator
enum = quot;helloquot;.enum_for(:each_byte)
:each_char
:each_line
# automatycznie (tylko 1.9)
enum = quot;helloquot;.each_char # => Enumerable::Enumerator
enum = quot;helloquot;.chars
enum = 1.upto(10)
# mniam
quot;helloquot;.chars.map {|c| c.succ}.join # => quot;ifmmpquot;
Ruby 1.9 21. Przykład c.d.
# zewnętrzny iterator
iter = quot;helloquot;.chars
begin
puts iter.next while true
rescue StopIteration
puts quot;koniecquot;
end
# quot;przewinięciequot; iteratora
iter.rewind
# Kernel.loop przechwytuje StopIteration
loop do
puts iter.next
end
puts quot;i znowu koniecquot;
Ruby 1.9 23. Lambdy i Proce
• Metody
Kernel.proc, Kernel.lambda
• Lambda literals
• Domyślne wartości
parametrów
• Uproszczone wywołanie
• lambda? 24. Tworzenie proc / lambda
!
NEW
# tworzenie procy # tworzenie procy
p = Proc.new { … } p = Proc.new { … }
p = proc { … }
# tworzenie lambdy
l = lambda { … } # tworzenie lambdy
l = proc { … } l = lambda { … }
Ruby 1.8 Ruby 1.9 25. Lambda literals
# dotychczas
square = lambda { |x| x**2 }
# nowość
square = ->(x){ x**2 }
# domyślne parametry
pow = ->(x, exp=2){ x**exp }
# można też tak:
pow = -> x, exp=2 { x**exp }
Ruby 1.9 26. Wywoływanie
square = ->(x){ x**2 }
# można tak:
square.call(14)
# albo tak:
square[14]
# a teraz dodatkowo tak:
square.(14)
Ruby 1.9 28. Fiber
• Co-routines
(współprogramy)
• Tworzenie generatorów
• Konwersja zewnętrzne -
- wewnętrzne iteratory 29. Przykład
# generator ciągu Fibonacciego:
f = Fiber.new do
x, y = 0, 1
loop do
Fiber.yield y
x, y = y, x+y
end
end
# użycie:
10.times { puts f.resume }
Ruby 1.9 30. Przykład
# wymiana danych między włóknem a głównym wątkiem
f = Fiber.new do |message|
puts quot;Program mówi: #{message}quot;
message2 = Fiber.yield quot;No witam!quot;
puts quot;Program mówi: #{message2}quot;
quot;Pozdroquot;
end
# wykonanie:
response = f.resume(quot;Cześćquot;)
puts quot;A włókno na to: #{response}quot;
response2 = f.resume(quot;Muszę leciećquot;)
puts quot;A włókno na to: #{response}quot;
Ruby 1.9 31. Przykład c.d.
class Generator
def initialize(enumerable)
@enumerable = enumerable
@fiber = Fiber.new do
@enumerable.each do |i|
Fiber.yield i
end
raise StopIteration
end
end
def next
@fiber.resume
end
end
# użycie:
g = Generator.new([1, 3, 5])
loop { puts g.next }
Ruby 1.9 33. Nowa składnia Hashy
Zmienne lokalne dla bloku
{ name: quot;Annaquot;, age: 27 }
arr.each do |i;x,y|
# …
end
Domyślne wartości parametrów.succ
reduce def foo(x, y=10, z)
quot;#{x}, #{y}, #{z}quot;
end
[1, 2, 3].reduce(:+)
foo(1, 2) # => quot;1, 10, 2quot; 34. Permutacje i kombinacje
a = [1, 2, 3]
a.permutation(2)
a.combination(2)
tap
quot;helloquot;.chomp.tap {|s| p s}.reverse
with_index
quot;helloquot;.each_char.with_index {|c,i| … }