Co nowego w świecie Ruby\'ego

36
Ł ukasz Adamczak http://czak.pl Co nowego w ś wiecie Ruby ego

description

 

Transcript of Co nowego w świecie Ruby\'ego

Page 1: Co nowego w świecie Ruby\'ego

Łukasz Adamczakhttp://czak.pl

Co nowegow świecie Ruby’ego

Page 2: Co nowego w świecie Ruby\'ego

Na czym stoimy?

Page 3: Co nowego w świecie Ruby\'ego

Luty 1993Matz zaczyna pracę nad Rubym

Grudzień 1996Ruby 1.0

Grudzień 2001“Programming Ruby”

Lipiec 2004Ruby on Rails

Zdjęcia: Marcin Bajer, Roo Reynolds

Page 4: Co nowego w świecie Ruby\'ego

Marzec 2007Ruby 1.8.6

Tu jesteś

Grudzień 2007Ruby 1.9.0

Maj 2008Ruby 1.8.7

Koniec 2008 (?)Ruby 2.0

Page 5: Co nowego w świecie Ruby\'ego

Quo vadis, Ruby?

Page 6: Co nowego w świecie Ruby\'ego

6Wydajność

UnicodeKolekcje

Lambdy i ProceFibersPerełki

Page 7: Co nowego w świecie Ruby\'ego

Wydajność

Page 9: Co nowego w świecie Ruby\'ego

YARV na ratunek

• Autor - Koichi Sasada

• “Yet Another Ruby VM”

• Merge - styczeń 2007

• Standard od 1.9

Zdjęcie: Marcin Bajer

Page 12: Co nowego w świecie Ruby\'ego

Unicode

Page 13: Co nowego w świecie Ruby\'ego

Gżegżółka?

こんにちは

كيف حالك؟ • Wiele standardów kodowania

• String - ciąg znaków, nie bajtów

• Klasa Encoding• String < Enumerable• Rozbudowa API

Page 14: Co nowego w świecie Ruby\'ego

Przykład

Ruby 1.8

> "Łukasz".length=> 7

> "Łukasz".reverse=> "zsaku\201\305"

> "Łukasz"[0]=> 197

Ruby 1.9

> "Łukasz".length=> 6

> "Łukasz".reverse=> "zsakuŁ"

> "Łukasz"[0]=> "Ł"

NEW!

Page 15: Co nowego w świecie Ruby\'ego

Przykład c.d.

Ruby 1.8

> "Łukasz"[0]=> 197

Ruby 1.9

> "Łukasz"[0]=> "Ł"

NEW!

> ?u=> 117

> "pies"[1]=> 105

> ?u=> "u"

> "małpa"[2]=> "ł"

Page 16: Co nowego w świecie Ruby\'ego

Encoding

んにちは

• Odwzorowaniebajty ↔ znaki

• Atrybut każdego Stringa

• Standardowe:ASCII_8BIT, UTF_8,EUC_JP, SHIFT_JIS

• Narzucenie, konwersja kodowania

0101101

Page 17: Co nowego w świecie Ruby\'ego

Przykład c.d.

Ruby 1.9

# coding: utf-8

# w pliku źródłowym:"Łukasz".encoding # => <Encoding: UTF-8>"Lukasz".encoding # => <Encoding: ASCII-8BIT>

# z zewnętrznego źródła:text = stream.readline.force_encoding("utf-8")f = File.open("data.txt", "r:utf-8")

# konwersja:euro = "€"euroiso = euro.encode("iso-8859-15")

Page 18: Co nowego w świecie Ruby\'ego

Kolekcje

Page 19: Co nowego w świecie Ruby\'ego

Enumerator• Klasa Enumerable::Enumerator

• Proxy dla kolekcji

• Kolekcje z “byle czego”

• Automatyczna konstrukcja

• Zewnętrzne iteratory

Page 20: Co nowego w świecie Ruby\'ego

Przykład# zwykłe proxyenum = [1, 2, 3].to_enum

# konkretny iteratorenum = "hello".enum_for(:each_byte) :each_char :each_line

# automatycznie (tylko 1.9)enum = "hello".each_char # => Enumerable::Enumeratorenum = "hello".charsenum = 1.upto(10)

# mniam"hello".chars.map {|c| c.succ}.join # => "ifmmp"

Ruby 1.9

Page 21: Co nowego w świecie Ruby\'ego

Przykład c.d.# zewnętrzny iteratoriter = "hello".charsbegin puts iter.next while truerescue StopIteration puts "koniec"end

# "przewinięcie" iteratoraiter.rewind

# Kernel.loop przechwytuje StopIterationloop do puts iter.nextendputs "i znowu koniec"

Ruby 1.9

Page 22: Co nowego w świecie Ruby\'ego

Lambdy i Proce

Page 23: Co nowego w świecie Ruby\'ego

Lambdy i Proce• MetodyKernel.proc, Kernel.lambda

• Lambda literals

• Domyślne wartości parametrów

• Uproszczone wywołanie

• lambda?

Page 24: Co nowego w świecie Ruby\'ego

Tworzenie proc / lambda

# tworzenie procyp = Proc.new { … }

# tworzenie lambdyl = lambda { … }

p = proc { … }

Ruby 1.9Ruby 1.8

# tworzenie procyp = Proc.new { … }

# tworzenie lambdyl = lambda { … }l = proc { … }

NEW!

Page 25: Co nowego w świecie Ruby\'ego

Lambda literals

Ruby 1.9

# dotychczassquare = lambda { |x| x**2 }

# nowośćsquare = ->(x){ x**2 }

# domyślne parametrypow = ->(x, exp=2){ x**exp }

# można też tak:pow = -> x, exp=2 { x**exp }

Page 26: Co nowego w świecie Ruby\'ego

Wywoływanie

Ruby 1.9

square = ->(x){ x**2 }

# można tak:square.call(14)

# albo tak:square[14]

# a teraz dodatkowo tak:square.(14)

Page 27: Co nowego w świecie Ruby\'ego

Włókna

Page 28: Co nowego w świecie Ruby\'ego

Fiber

• Co-routines (współprogramy)

• Tworzenie generatorów

• Konwersja zewnętrzne -- wewnętrzne iteratory

Page 29: Co nowego w świecie Ruby\'ego

Przykład# generator ciągu Fibonacciego:f = Fiber.new do x, y = 0, 1 loop do Fiber.yield y x, y = y, x+y endend

Ruby 1.9

# użycie:10.times { puts f.resume }

Page 30: Co nowego w świecie Ruby\'ego

Przykład

Ruby 1.9

# wymiana danych między włóknem a głównym wątkiemf = Fiber.new do |message| puts "Program mówi: #{message}" message2 = Fiber.yield "No witam!" puts "Program mówi: #{message2}" "Pozdro"end

# wykonanie:response = f.resume("Cześć")puts "A włókno na to: #{response}"response2 = f.resume("Muszę lecieć")puts "A włókno na to: #{response}"

Page 31: Co nowego w świecie Ruby\'ego

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 endend

Ruby 1.9

# użycie:g = Generator.new([1, 3, 5])loop { puts g.next }

Page 32: Co nowego w świecie Ruby\'ego

Perełki

Page 33: Co nowego w świecie Ruby\'ego

{ name: "Anna", age: 27 }

Nowa składnia Hashy

arr.each do |i;x,y| # …end

Zmienne lokalne dla bloku

def foo(x, y=10, z) "#{x}, #{y}, #{z}"end

foo(1, 2) # => "1, 10, 2"

Domyślne wartości parametrów.succ

[1, 2, 3].reduce(:+)

reduce

Page 34: Co nowego w świecie Ruby\'ego

"hello".each_char.with_index {|c,i| … }

a = [1, 2, 3]a.permutation(2)a.combination(2)

with_index

Permutacje i kombinacje

"hello".chomp.tap {|s| p s}.reverse

tap

Page 35: Co nowego w świecie Ruby\'ego

Pytania?

Page 36: Co nowego w świecie Ruby\'ego

Dziękuję© 2008 Łukasz Adamczak