Co nowego w świecie Ruby\'ego

2,713 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,713
On SlideShare
0
From Embeds
0
Number of Embeds
88
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Co nowego w świecie Ruby\'ego

  1. 1. Łukasz Adamczak http://czak.pl Co nowego w świecie Ruby’ego
  2. 2. Na czym stoimy?
  3. 3. 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
  4. 4. Marzec 2007 Ruby 1.8.6 Grudzień 2007 Ruby 1.9.0 Tu jesteś Maj 2008 Ruby 1.8.7 Koniec 2008 (?) Ruby 2.0
  5. 5. Quo vadis, Ruby?
  6. 6. Wydajność 6 Unicode Kolekcje Lambdy i Proce Fibers Perełki
  7. 7. Wydajność
  8. 8. Stan na dziś Źródło: Ruby vs PHP Performance Revisited
  9. 9. YARV na ratunek • Autor - Koichi Sasada • “Yet Another Ruby VM” • Merge - styczeń 2007 • Standard od 1.9 Zdjęcie: Marcin Bajer
  10. 10. Efekt? Źródło: The Great Ruby Shootout
  11. 11. Inne implementacje Źródło: The Great Ruby Shootout
  12. 12. Unicode
  13. 13. Gżegżółka? ‫ﻛﻴﻒ ﺣﺎﻟﻚ؟‬ • Wiele standardów kodowania • String - ciąg znaków, nie bajtów • Klasa Encoding • String < Enumerable • Rozbudowa API
  14. 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. 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. 16. Encoding • Odwzorowanie bajty znaki 0101101 • Atrybut każdego Stringa • Standardowe: ASCII_8BIT, UTF_8, EUC_JP, SHIFT_JIS • Narzucenie, konwersja kodowania
  17. 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
  18. 18. Kolekcje
  19. 19. Enumerator • Klasa Enumerable::Enumerator • Proxy dla kolekcji • Kolekcje z “byle czego” • Automatyczna konstrukcja • Zewnętrzne iteratory
  20. 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. 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
  22. 22. Lambdy i Proce
  23. 23. Lambdy i Proce • Metody Kernel.proc, Kernel.lambda • Lambda literals • Domyślne wartości parametrów • Uproszczone wywołanie • lambda?
  24. 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. 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. 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
  27. 27. Włókna
  28. 28. Fiber • Co-routines (współprogramy) • Tworzenie generatorów • Konwersja zewnętrzne - - wewnętrzne iteratory
  29. 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. 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. 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
  32. 32. Perełki
  33. 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. 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| … }
  35. 35. Pytania?
  36. 36. Dziękuję © 2008 Łukasz Adamczak

×