SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
Migrating to
Ruby 1.9



               Bruce Williams
Bruce Williams
Perpetrator of much random Ruby hackery, language tourist


Rubyist since 2001               (Full-time since 2005)

Open source developer, contributer, technical editor, designer
Occasionally blogs at http://codefluency.com
Ruby 1.8                  Ruby 1.9
Stable.                   Unstable, transitional.
The syntax and language   Many new syntax and
features you know and     language features.
probably love.
                          Better performance,
The performance profile    especially for computationally
you know and might hate   intensive operations.
a little.
1.9 is a hint.
1.9 is a hint.
   Get ready for 2.0.
Ruby’s Releases
From Toybox to Toolshed
                                             (dev)
(dev)                                         1.7                                                         (dev)
           1.6.1 1.6.3 1.6.5                         1.8.1                  1.8.4
 1.5                                                                                                       1.9
        1.6.0 1.6.2 1.6.4    1.6.7   1.6.8       1.8.0       1.8.2                    1.8.5     1.8.6
                                                                        1.8.3



 ‘00           ‘01         ‘02          ‘03           ‘04      ‘05              ‘06           ‘07         ‘08


 Japan                   Beyond Japan                                “... on Rails”                     Expansion
Standard Library
    rubygems (+ prelude & ruby --disable-gems), rake, json (pure,
+   ext), ripper, probeprofiler, securerandom, HMAC
    digests
~   csv replaced by FasterCSV implementation

-   soap, wsdl, base64, some rarely used, old libraries
Parser Changes
Flexibility and Obscurity (for the moment)
Parser Changes
New Hash Literal
{a: quot;fooquot;}
# => {:a=>quot;fooquot;}

{a: quot;barquot;, :b => quot;bazquot;}
# => {:a=>quot;barquot;, :b=>quot;bazquot;}
Parser Changes
New Proc Literal
multiply_by_2 = ->(x) { x * 2 }
# => #<Proc:0x3c5a50>

multiply_by_2.(4)
# => 8
Parser Changes
Splat more flexibly

names = %w(joe john bill)
[*names, 'jack']
# => [quot;joequot;, quot;johnquot;, quot;billquot;, quot;jackquot;]
Parser Changes
Method parameter ordering

def say(language=:english, text)
  puts Translator[language].translate(text)
end
say quot;helloquot;
# hello
say :spanish, quot;helloquot;
# hola
Migration Risk Factors

Text processing
“Clever” assignment with blocks
Some Hash enumerations
Metaprogramming, code generation
Tests are Good
I was surprised at how much work my 11th hour integration of the
FasterCSV code was. It was a pure Ruby library that really didn't do
a lot of fancy tricks, but I had to track down about 20 little issues
to get it running under Ruby 1.9. Thank goodness it had terrific test
coverage to lead me to the problem areas.

                                             - James Edward Gray II
  Follow-up at http://blog.grayproductions.net/articles/getting_code_ready_for_ruby_19
Block Local Variables
Arguments are always local

Ruby 1.8                     Ruby 1.9
item = 1                     item = 1
2.upto(4) do |item|          2.upto(4) do |item|
  p item                       p item
end                          end
# Outputs:                   # Outputs:
#    2                       #    2
#    3                       #    3
#    4                       #    4
item                         item
# => 4                       # => 1
Shadowing Variables
You’ll get a warning

Ruby 1.8                     Ruby 1.9
i=1                          i=1
lambda { |i| p i }.call(3)   lambda { |i| p i }.call(3)
# Outputs                    # Outputs
#3                           #3
i                            i
# => 3                       # => 1

                             -e:2: warning: shadowing outer local variable - i
Shadowing Variables
Locals, but warned

No local, reassigns      Local, shadowed
d=2                      d=2
-> { d = 1 }.()          ->(;d) { d = 1 }.()
d                        d
# => 1                   # => 2
            (Ruby 1.9)   -e:2: warning: shadowing outer local variable - d
Hash#select (etc)
Changes to yielded arguments

Ruby 1.8                                                    Ruby 1.9
conferences.select do |data|                               conferences.select do |data|
  p data                                                     p data
end                                                        end
# [:euruko, quot;Praguequot;]                                      # :euruko
# [:scotland_on_rails, quot;Edinburghquot;]                        # :scotland_on_rails
# [:railsconf_europe, quot;Berlinquot;]                            # :railsconf_europe

                                                           conferences.select do |name, city|
warning: multiple values for a block parameter (2 for 1)
                                                             p [name, city]
                                                           end
                                                           # [:euruko, quot;Praguequot;]
                                                           # [:scotland_on_rails, quot;Edinburghquot;]
                                                           # [:railsconf_europe, quot;Berlinquot;]
Hash#select (etc)
Returns a Hash

Ruby 1.8                                   Ruby 1.9
conferences.select do |name, _|            conferences.select do |name, _|
  name == :scotland_on_rails                 name == :scotland_on_rails
end                                        end
# => [[:scotland_on_rails, quot;Edinburghquot;]]   # => {:scotland_on_rails=>quot;Edinburghquot;}
Features
Lots of changes,
some big ones
Multilingualization
(m17n)

There is one type of string, and the encoding is mutable

Strings are no longer Enumerable (use #each_char, #each_line, etc)

The encoding is ‘lazy’ and can be set by probing with
String#ascii_only? and String#valid_encoding?. 

Various ways to set default encoding (commandline, magic
comments)

String#[] now returns a String, not a Fixnum (use ord)
[:ASCII_8BIT, :Big5, :BIG5, :CP949, :EUC_JP, :EUC_KR, :EUC_TW, :GB18030, :GBK, :ISO_885
9_1, :ISO_8859_2, :ISO_8859_3, :ISO_8859_4, :ISO_8859_5, :ISO_8859_6, :ISO_8859_7, :IS
O_8859_8, :ISO_8859_9, :ISO_8859_10, :ISO_8859_11, :ISO_8859_13, :ISO_8859_14, :ISO
_8859_15, :ISO_8859_16, :KOI8_R, :KOI8_U, :Shift_JIS, :SHIFT_JIS, :US_ASCII, :UTF_8, :UTF
_16BE, :UTF_16LE, :UTF_32BE, :UTF_32LE, :Windows_1251, :WINDOWS_1251, :BINARY, :I
BM437, :CP437, :IBM737, :CP737, :IBM775, :CP775, :CP850, :IBM850, :IBM852, :CP852, :IBM85
5, :CP855, :IBM857, :CP857, :IBM860, :CP860, :IBM861, :CP861, :IBM862, :CP862, :IBM863, :CP
863, :IBM864, :CP864, :IBM865, :CP865, :IBM866, :CP866, :IBM869, :CP869, :Windows_1258, :
WINDOWS_1258, :CP1258, :GB1988, :MacCentEuro, :MACCENTEURO, :MacCroatian, :MA
CCROATIAN, :MacCyrillic, :MACCYRILLIC, :MacGreek, :MACGREEK, :MacIceland, :MACICE
LAND, :MacRoman, :MACROMAN, :MacRomania, :MACROMANIA, :MacThai, :MACTHAI, :M
acTurkish, :MACTURKISH, :MacUkraine, :MACUKRAINE, :CP950, :EucJP, :EUCJP, :EucJP_ms, :E
UCJP_MS, :EUC_JP_MS, :CP51932, :EucKR, :EUCKR, :EucTW, :EUCTW, :EUC_CN, :EucCN, :
EUCCN, :GB12345, :CP936, :ISO_2022_JP, :ISO2022_JP, :ISO_2022_JP_2, :ISO2022_JP2, :ISO
8859_1, :Windows_1252, :WINDOWS_1252, :CP1252, :ISO8859_2, :Windows_1250, :WIN
DOWS_1250, :CP1250, :ISO8859_3, :ISO8859_4, :ISO8859_5, :ISO8859_6, :Windows_1256,
:WINDOWS_1256, :CP1256, :ISO8859_7, :Windows_1253, :WINDOWS_1253, :CP1253, :IS
O8859_8, :Windows_1255, :WINDOWS_1255, :CP1255, :ISO8859_9, :Windows_1254, :WI
NDOWS_1254, :CP1254, :ISO8859_10, :ISO8859_11, :TIS_620, :Windows_874, :WINDOW
S_874, :CP874, :ISO8859_13, :Windows_1257, :WINDOWS_1257, :CP1257, :ISO8859_14, :I
SO8859_15, :ISO8859_16, :CP878, :SJIS, :Windows_31J, :WINDOWS_31J, :CP932, :CsWindo
ws31J, :CSWINDOWS31J, :MacJapanese, :MACJAPANESE, :MacJapan, :MACJAPAN, :ASCII, :A
NSI_X3_4_1968, :UTF_7, :CP65000, :CP65001, :UCS_2BE, :UCS_4BE, :UCS_4LE, :CP1251]
Multilingualization
Read a file with File.read


 File.read(quot;input.txtquot;).encoding
 # => #<Encoding:UTF-8>

 File.read(quot;input.txtquot;, encoding: 'ascii-8bit').encoding
 # => #<Encoding:ASCII-8BIT>
Multilingualization
Read a file with File.open

    result = File.open(quot;input.txtquot;, quot;r:euc-jpquot;) do |f|
      f.read
    end
    result.encoding
    # => #<Encoding:EUC-JP>
    result.valid_encoding?
    # => true
Regular Expressions
Integrated “oniguruma” engine

Same basic API

Much better performance

Support for encodings

Extended Syntax
Look-ahead (?=), (?!), look-behind (?<), (?<!)

Named groups (?<>), backreferences, etc
Regular Expressions
Named Groups




quot;His name is Joequot;.match(/name is (?<name>S+)/)[:name]
# => quot;Joequot;
Enumerable
Enumerator built-in, returned from Enumerable methods (and
those in Array, Dir, Hash, IO, Range, String or Struct that serve the
same purposes). Added Enumerator#with_index



                           Map with index
  %w(Joe John Jack).map.with_index do |name, offset|
    quot;#{name} is #{offset + 1}quot;
  end
  # => [quot;Joe is #1quot;, quot;John is #2quot;, quot;Jack is #3quot;]
Enumerable
reduce (inject)




            [1,2,3,4].reduce(:+)
            # => 10
Enumerable
New Enumerable methods take, group_by, drop, min_by, max_by,
count, and others.


        take                            drop

 array = [1, 2, 3, 4, 5]        array = [1, 2, 3, 4, 5]
 array.take(3)                  array.drop(3)
 # => [1, 2, 3]                 # => [4, 5]
 array                          array
 # => [1, 2, 3, 4, 5]           # => [1, 2, 3, 4, 5]
Hash Changes
Insertion order preserved
conferences = {
  euruko: 'Prague',
  scotland_on_rails: 'Edinburgh'
}
conferences[:railsconf_europe] = 'Berlin'
conferences.each do |name, city|
  p quot;#{name} is in #{city}quot;
end
# quot;euruko is in Praguequot;
# quot;scotland_on_rails is in Edinburghquot;
# quot;railsconf_europe is in Berlinquot;
conferences.delete(:scotland_on_rails)
conferences[:scotland_on_rails] = 'Edinburgh'
conferences.each do |name, city|
  p quot;#{name} is in #{city}quot;
end
# quot;euruko is in Praguequot;
# quot;railsconf_europe is in Berlinquot;
# quot;scotland_on_rails is in Edinburghquot;
Object
Added tap



      thing = Thing.new.tap do |thing|
        thing.something = 1
        thing.something_else = 2
      end
Lambda Changes
Obfuscation, ahoy!
New literal syntax more flexible

Not possible in { | | ... } style literals


Passing blocks                               Default arguments
m = ->(x, &b) { b.(x * 2) if b }         ->(a, b=2) { a * b }.(3)
m.(3) do |result|
                                         # => 6
  puts result
end
# Output
#6
Symbol Changes
Less sibling rivalry

Added to_proc

Added =~, [] like String (to_s less needed), sortable

Object#methods, etc now return an array of symbols


Indexing into                     Comparing with a String
:foo[1]                           :this === quot;thisquot;
                                  # => true
# => quot;oquot;
Fibers
“Semi-coroutines”

Similar to Python’s generators
Owe method naming lineage to Lua
Out of scope of the talk, but very cool
For some examples, see:
http://pragdave.blogs.pragprog.com/pragdave/2007/12/pipelines-using.html (and follow-up)

http://www.davidflanagan.com/blog/2007_08.html (older)

Revactor project (Actors in 1.9 using Fibers + Threads)

InfoQ, others...
This was really just an introduction.




Bruce Williams                              twitter: wbruce
                  bruce@codefluency.com

Más contenido relacionado

La actualidad más candente

Rapid Development with Ruby/JRuby and Rails
Rapid Development with Ruby/JRuby and RailsRapid Development with Ruby/JRuby and Rails
Rapid Development with Ruby/JRuby and Railselliando dias
 
Objective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchObjective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchMatteo Battaglio
 
Opaque Pointers Are Coming
Opaque Pointers Are ComingOpaque Pointers Are Coming
Opaque Pointers Are ComingNikita Popov
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Pythonkwatch
 
Hacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 AutumnHacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 AutumnMoriyoshi Koizumi
 
PHP Performance Trivia
PHP Performance TriviaPHP Performance Trivia
PHP Performance TriviaNikita Popov
 
Runtime Symbol Resolution
Runtime Symbol ResolutionRuntime Symbol Resolution
Runtime Symbol ResolutionKen Kawamoto
 
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur..."How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...Fwdays
 
Declarative Internal DSLs in Lua: A Game Changing Experience
Declarative Internal DSLs in Lua: A Game Changing ExperienceDeclarative Internal DSLs in Lua: A Game Changing Experience
Declarative Internal DSLs in Lua: A Game Changing ExperienceAlexander Gladysh
 
RubyKaigi2015 making robots-with-mruby
RubyKaigi2015 making robots-with-mrubyRubyKaigi2015 making robots-with-mruby
RubyKaigi2015 making robots-with-mrubyyamanekko
 
Static Optimization of PHP bytecode (PHPSC 2017)
Static Optimization of PHP bytecode (PHPSC 2017)Static Optimization of PHP bytecode (PHPSC 2017)
Static Optimization of PHP bytecode (PHPSC 2017)Nikita Popov
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaPatrick Allaert
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsMichael Pirnat
 
HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4Linaro
 
Kai – An Open Source Implementation of Amazon’s Dynamo
Kai – An Open Source Implementation of Amazon’s DynamoKai – An Open Source Implementation of Amazon’s Dynamo
Kai – An Open Source Implementation of Amazon’s DynamoTakeru INOUE
 
HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3Linaro
 
Aspect Mining for Large Systems
Aspect Mining for Large SystemsAspect Mining for Large Systems
Aspect Mining for Large SystemsThomas Zimmermann
 

La actualidad más candente (20)

Rapid Development with Ruby/JRuby and Rails
Rapid Development with Ruby/JRuby and RailsRapid Development with Ruby/JRuby and Rails
Rapid Development with Ruby/JRuby and Rails
 
Ruby meets Go
Ruby meets GoRuby meets Go
Ruby meets Go
 
Objective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchObjective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central Dispatch
 
Opaque Pointers Are Coming
Opaque Pointers Are ComingOpaque Pointers Are Coming
Opaque Pointers Are Coming
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
Hacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 AutumnHacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 Autumn
 
Writing Parsers and Compilers with PLY
Writing Parsers and Compilers with PLYWriting Parsers and Compilers with PLY
Writing Parsers and Compilers with PLY
 
PHP Performance Trivia
PHP Performance TriviaPHP Performance Trivia
PHP Performance Trivia
 
Runtime Symbol Resolution
Runtime Symbol ResolutionRuntime Symbol Resolution
Runtime Symbol Resolution
 
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur..."How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
 
Declarative Internal DSLs in Lua: A Game Changing Experience
Declarative Internal DSLs in Lua: A Game Changing ExperienceDeclarative Internal DSLs in Lua: A Game Changing Experience
Declarative Internal DSLs in Lua: A Game Changing Experience
 
RubyKaigi2015 making robots-with-mruby
RubyKaigi2015 making robots-with-mrubyRubyKaigi2015 making robots-with-mruby
RubyKaigi2015 making robots-with-mruby
 
Static Optimization of PHP bytecode (PHPSC 2017)
Static Optimization of PHP bytecode (PHPSC 2017)Static Optimization of PHP bytecode (PHPSC 2017)
Static Optimization of PHP bytecode (PHPSC 2017)
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 Verona
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
 
HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4
 
Kai – An Open Source Implementation of Amazon’s Dynamo
Kai – An Open Source Implementation of Amazon’s DynamoKai – An Open Source Implementation of Amazon’s Dynamo
Kai – An Open Source Implementation of Amazon’s Dynamo
 
HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3
 
Aspect Mining for Large Systems
Aspect Mining for Large SystemsAspect Mining for Large Systems
Aspect Mining for Large Systems
 
Intro to J Ruby
Intro to J RubyIntro to J Ruby
Intro to J Ruby
 

Destacado

The road to war, the aesthetics of anguish
The road to war, the aesthetics of anguishThe road to war, the aesthetics of anguish
The road to war, the aesthetics of anguishrosabrito
 
The Human Side of UX Design (WordCamp Toronto)
The Human Side of UX Design (WordCamp Toronto)The Human Side of UX Design (WordCamp Toronto)
The Human Side of UX Design (WordCamp Toronto)James Archer
 
Arrowsmith Builders
Arrowsmith BuildersArrowsmith Builders
Arrowsmith Buildersguest2b5518
 
Tarea2 Ea2
Tarea2 Ea2Tarea2 Ea2
Tarea2 Ea2Peredak
 
OruAcre.com Marketing
OruAcre.com MarketingOruAcre.com Marketing
OruAcre.com Marketingsselvan
 

Destacado (6)

The road to war, the aesthetics of anguish
The road to war, the aesthetics of anguishThe road to war, the aesthetics of anguish
The road to war, the aesthetics of anguish
 
The Human Side of UX Design (WordCamp Toronto)
The Human Side of UX Design (WordCamp Toronto)The Human Side of UX Design (WordCamp Toronto)
The Human Side of UX Design (WordCamp Toronto)
 
Lm741
Lm741Lm741
Lm741
 
Arrowsmith Builders
Arrowsmith BuildersArrowsmith Builders
Arrowsmith Builders
 
Tarea2 Ea2
Tarea2 Ea2Tarea2 Ea2
Tarea2 Ea2
 
OruAcre.com Marketing
OruAcre.com MarketingOruAcre.com Marketing
OruAcre.com Marketing
 

Similar a Migrating To Ruby1.9

Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2rubyMarc Chung
 
How to check valid Email? Find using regex.
How to check valid Email? Find using regex.How to check valid Email? Find using regex.
How to check valid Email? Find using regex.Poznań Ruby User Group
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Aslak Hellesøy
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Aslak Hellesøy
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Aslak Hellesøy
 
React Native Evening
React Native EveningReact Native Evening
React Native EveningTroy Miles
 
Cより速いRubyプログラム
Cより速いRubyプログラムCより速いRubyプログラム
Cより速いRubyプログラムkwatch
 
Quick Intro To JRuby
Quick Intro To JRubyQuick Intro To JRuby
Quick Intro To JRubyFrederic Jean
 
A Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to GoA Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to GoMatt Stine
 
Ruby on Rails 3.1: Let's bring the fun back into web programing
Ruby on Rails 3.1: Let's bring the fun back into web programingRuby on Rails 3.1: Let's bring the fun back into web programing
Ruby on Rails 3.1: Let's bring the fun back into web programingBozhidar Batsov
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoRodolfo Carvalho
 
Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous MerbMatt Todd
 
Ruby 1.9 Introduction
Ruby 1.9 IntroductionRuby 1.9 Introduction
Ruby 1.9 IntroductionBradly Feeley
 
Google's HTML5 Work: what's next?
Google's HTML5 Work: what's next?Google's HTML5 Work: what's next?
Google's HTML5 Work: what's next?Patrick Chanezon
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot CampTroy Miles
 

Similar a Migrating To Ruby1.9 (20)

Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2ruby
 
How to check valid Email? Find using regex.
How to check valid Email? Find using regex.How to check valid Email? Find using regex.
How to check valid Email? Find using regex.
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009
 
Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009Ruby presentasjon på NTNU 22 april 2009
Ruby presentasjon på NTNU 22 april 2009
 
Ruby 1.9
Ruby 1.9Ruby 1.9
Ruby 1.9
 
React Native Evening
React Native EveningReact Native Evening
React Native Evening
 
Cより速いRubyプログラム
Cより速いRubyプログラムCより速いRubyプログラム
Cより速いRubyプログラム
 
Quick Intro To JRuby
Quick Intro To JRubyQuick Intro To JRuby
Quick Intro To JRuby
 
A Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to GoA Recovering Java Developer Learns to Go
A Recovering Java Developer Learns to Go
 
Ruby on Rails 3.1: Let's bring the fun back into web programing
Ruby on Rails 3.1: Let's bring the fun back into web programingRuby on Rails 3.1: Let's bring the fun back into web programing
Ruby on Rails 3.1: Let's bring the fun back into web programing
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX Go
 
Groovy
GroovyGroovy
Groovy
 
Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous Merb
 
Ruby 1.9 Introduction
Ruby 1.9 IntroductionRuby 1.9 Introduction
Ruby 1.9 Introduction
 
An introduction to Ruby
An introduction to RubyAn introduction to Ruby
An introduction to Ruby
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentation
 
Practical Groovy DSL
Practical Groovy DSLPractical Groovy DSL
Practical Groovy DSL
 
Google's HTML5 Work: what's next?
Google's HTML5 Work: what's next?Google's HTML5 Work: what's next?
Google's HTML5 Work: what's next?
 
Node Boot Camp
Node Boot CampNode Boot Camp
Node Boot Camp
 

Último

Disha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfDisha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfchloefrazer622
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Disha Kariya
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Sapana Sha
 
Russian Call Girls in Andheri Airport Mumbai WhatsApp 9167673311 💞 Full Nigh...
Russian Call Girls in Andheri Airport Mumbai WhatsApp  9167673311 💞 Full Nigh...Russian Call Girls in Andheri Airport Mumbai WhatsApp  9167673311 💞 Full Nigh...
Russian Call Girls in Andheri Airport Mumbai WhatsApp 9167673311 💞 Full Nigh...Pooja Nehwal
 
The byproduct of sericulture in different industries.pptx
The byproduct of sericulture in different industries.pptxThe byproduct of sericulture in different industries.pptx
The byproduct of sericulture in different industries.pptxShobhayan Kirtania
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfchloefrazer622
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfJayanti Pande
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAssociation for Project Management
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactdawncurless
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformChameera Dedduwage
 
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...EduSkills OECD
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfsanyamsingh5019
 
social pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajansocial pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajanpragatimahajan3
 
JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...
JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...
JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...anjaliyadav012327
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationnomboosow
 

Último (20)

Disha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfDisha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdf
 
Advance Mobile Application Development class 07
Advance Mobile Application Development class 07Advance Mobile Application Development class 07
Advance Mobile Application Development class 07
 
Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
 
Russian Call Girls in Andheri Airport Mumbai WhatsApp 9167673311 💞 Full Nigh...
Russian Call Girls in Andheri Airport Mumbai WhatsApp  9167673311 💞 Full Nigh...Russian Call Girls in Andheri Airport Mumbai WhatsApp  9167673311 💞 Full Nigh...
Russian Call Girls in Andheri Airport Mumbai WhatsApp 9167673311 💞 Full Nigh...
 
The byproduct of sericulture in different industries.pptx
The byproduct of sericulture in different industries.pptxThe byproduct of sericulture in different industries.pptx
The byproduct of sericulture in different industries.pptx
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdf
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdf
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across Sectors
 
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptxINDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impact
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy Reform
 
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
 
Sanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdfSanyam Choudhary Chemistry practical.pdf
Sanyam Choudhary Chemistry practical.pdf
 
social pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajansocial pharmacy d-pharm 1st year by Pragati K. Mahajan
social pharmacy d-pharm 1st year by Pragati K. Mahajan
 
JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...
JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...
JAPAN: ORGANISATION OF PMDA, PHARMACEUTICAL LAWS & REGULATIONS, TYPES OF REGI...
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communication
 

Migrating To Ruby1.9

  • 1. Migrating to Ruby 1.9 Bruce Williams
  • 2. Bruce Williams Perpetrator of much random Ruby hackery, language tourist Rubyist since 2001 (Full-time since 2005) Open source developer, contributer, technical editor, designer Occasionally blogs at http://codefluency.com
  • 3. Ruby 1.8 Ruby 1.9 Stable. Unstable, transitional. The syntax and language Many new syntax and features you know and language features. probably love. Better performance, The performance profile especially for computationally you know and might hate intensive operations. a little.
  • 4. 1.9 is a hint.
  • 5. 1.9 is a hint. Get ready for 2.0.
  • 6. Ruby’s Releases From Toybox to Toolshed (dev) (dev) 1.7 (dev) 1.6.1 1.6.3 1.6.5 1.8.1 1.8.4 1.5 1.9 1.6.0 1.6.2 1.6.4 1.6.7 1.6.8 1.8.0 1.8.2 1.8.5 1.8.6 1.8.3 ‘00 ‘01 ‘02 ‘03 ‘04 ‘05 ‘06 ‘07 ‘08 Japan Beyond Japan “... on Rails” Expansion
  • 7. Standard Library rubygems (+ prelude & ruby --disable-gems), rake, json (pure, + ext), ripper, probeprofiler, securerandom, HMAC digests ~ csv replaced by FasterCSV implementation - soap, wsdl, base64, some rarely used, old libraries
  • 8. Parser Changes Flexibility and Obscurity (for the moment)
  • 9. Parser Changes New Hash Literal {a: quot;fooquot;} # => {:a=>quot;fooquot;} {a: quot;barquot;, :b => quot;bazquot;} # => {:a=>quot;barquot;, :b=>quot;bazquot;}
  • 10. Parser Changes New Proc Literal multiply_by_2 = ->(x) { x * 2 } # => #<Proc:0x3c5a50> multiply_by_2.(4) # => 8
  • 11. Parser Changes Splat more flexibly names = %w(joe john bill) [*names, 'jack'] # => [quot;joequot;, quot;johnquot;, quot;billquot;, quot;jackquot;]
  • 12. Parser Changes Method parameter ordering def say(language=:english, text) puts Translator[language].translate(text) end say quot;helloquot; # hello say :spanish, quot;helloquot; # hola
  • 13. Migration Risk Factors Text processing “Clever” assignment with blocks Some Hash enumerations Metaprogramming, code generation
  • 14. Tests are Good I was surprised at how much work my 11th hour integration of the FasterCSV code was. It was a pure Ruby library that really didn't do a lot of fancy tricks, but I had to track down about 20 little issues to get it running under Ruby 1.9. Thank goodness it had terrific test coverage to lead me to the problem areas. - James Edward Gray II Follow-up at http://blog.grayproductions.net/articles/getting_code_ready_for_ruby_19
  • 15. Block Local Variables Arguments are always local Ruby 1.8 Ruby 1.9 item = 1 item = 1 2.upto(4) do |item| 2.upto(4) do |item| p item p item end end # Outputs: # Outputs: # 2 # 2 # 3 # 3 # 4 # 4 item item # => 4 # => 1
  • 16. Shadowing Variables You’ll get a warning Ruby 1.8 Ruby 1.9 i=1 i=1 lambda { |i| p i }.call(3) lambda { |i| p i }.call(3) # Outputs # Outputs #3 #3 i i # => 3 # => 1 -e:2: warning: shadowing outer local variable - i
  • 17. Shadowing Variables Locals, but warned No local, reassigns Local, shadowed d=2 d=2 -> { d = 1 }.() ->(;d) { d = 1 }.() d d # => 1 # => 2 (Ruby 1.9) -e:2: warning: shadowing outer local variable - d
  • 18. Hash#select (etc) Changes to yielded arguments Ruby 1.8 Ruby 1.9 conferences.select do |data| conferences.select do |data| p data p data end end # [:euruko, quot;Praguequot;] # :euruko # [:scotland_on_rails, quot;Edinburghquot;] # :scotland_on_rails # [:railsconf_europe, quot;Berlinquot;] # :railsconf_europe conferences.select do |name, city| warning: multiple values for a block parameter (2 for 1) p [name, city] end # [:euruko, quot;Praguequot;] # [:scotland_on_rails, quot;Edinburghquot;] # [:railsconf_europe, quot;Berlinquot;]
  • 19. Hash#select (etc) Returns a Hash Ruby 1.8 Ruby 1.9 conferences.select do |name, _| conferences.select do |name, _| name == :scotland_on_rails name == :scotland_on_rails end end # => [[:scotland_on_rails, quot;Edinburghquot;]] # => {:scotland_on_rails=>quot;Edinburghquot;}
  • 21. Multilingualization (m17n) There is one type of string, and the encoding is mutable Strings are no longer Enumerable (use #each_char, #each_line, etc) The encoding is ‘lazy’ and can be set by probing with String#ascii_only? and String#valid_encoding?.  Various ways to set default encoding (commandline, magic comments) String#[] now returns a String, not a Fixnum (use ord)
  • 22. [:ASCII_8BIT, :Big5, :BIG5, :CP949, :EUC_JP, :EUC_KR, :EUC_TW, :GB18030, :GBK, :ISO_885 9_1, :ISO_8859_2, :ISO_8859_3, :ISO_8859_4, :ISO_8859_5, :ISO_8859_6, :ISO_8859_7, :IS O_8859_8, :ISO_8859_9, :ISO_8859_10, :ISO_8859_11, :ISO_8859_13, :ISO_8859_14, :ISO _8859_15, :ISO_8859_16, :KOI8_R, :KOI8_U, :Shift_JIS, :SHIFT_JIS, :US_ASCII, :UTF_8, :UTF _16BE, :UTF_16LE, :UTF_32BE, :UTF_32LE, :Windows_1251, :WINDOWS_1251, :BINARY, :I BM437, :CP437, :IBM737, :CP737, :IBM775, :CP775, :CP850, :IBM850, :IBM852, :CP852, :IBM85 5, :CP855, :IBM857, :CP857, :IBM860, :CP860, :IBM861, :CP861, :IBM862, :CP862, :IBM863, :CP 863, :IBM864, :CP864, :IBM865, :CP865, :IBM866, :CP866, :IBM869, :CP869, :Windows_1258, : WINDOWS_1258, :CP1258, :GB1988, :MacCentEuro, :MACCENTEURO, :MacCroatian, :MA CCROATIAN, :MacCyrillic, :MACCYRILLIC, :MacGreek, :MACGREEK, :MacIceland, :MACICE LAND, :MacRoman, :MACROMAN, :MacRomania, :MACROMANIA, :MacThai, :MACTHAI, :M acTurkish, :MACTURKISH, :MacUkraine, :MACUKRAINE, :CP950, :EucJP, :EUCJP, :EucJP_ms, :E UCJP_MS, :EUC_JP_MS, :CP51932, :EucKR, :EUCKR, :EucTW, :EUCTW, :EUC_CN, :EucCN, : EUCCN, :GB12345, :CP936, :ISO_2022_JP, :ISO2022_JP, :ISO_2022_JP_2, :ISO2022_JP2, :ISO 8859_1, :Windows_1252, :WINDOWS_1252, :CP1252, :ISO8859_2, :Windows_1250, :WIN DOWS_1250, :CP1250, :ISO8859_3, :ISO8859_4, :ISO8859_5, :ISO8859_6, :Windows_1256, :WINDOWS_1256, :CP1256, :ISO8859_7, :Windows_1253, :WINDOWS_1253, :CP1253, :IS O8859_8, :Windows_1255, :WINDOWS_1255, :CP1255, :ISO8859_9, :Windows_1254, :WI NDOWS_1254, :CP1254, :ISO8859_10, :ISO8859_11, :TIS_620, :Windows_874, :WINDOW S_874, :CP874, :ISO8859_13, :Windows_1257, :WINDOWS_1257, :CP1257, :ISO8859_14, :I SO8859_15, :ISO8859_16, :CP878, :SJIS, :Windows_31J, :WINDOWS_31J, :CP932, :CsWindo ws31J, :CSWINDOWS31J, :MacJapanese, :MACJAPANESE, :MacJapan, :MACJAPAN, :ASCII, :A NSI_X3_4_1968, :UTF_7, :CP65000, :CP65001, :UCS_2BE, :UCS_4BE, :UCS_4LE, :CP1251]
  • 23. Multilingualization Read a file with File.read File.read(quot;input.txtquot;).encoding # => #<Encoding:UTF-8> File.read(quot;input.txtquot;, encoding: 'ascii-8bit').encoding # => #<Encoding:ASCII-8BIT>
  • 24. Multilingualization Read a file with File.open result = File.open(quot;input.txtquot;, quot;r:euc-jpquot;) do |f| f.read end result.encoding # => #<Encoding:EUC-JP> result.valid_encoding? # => true
  • 25. Regular Expressions Integrated “oniguruma” engine Same basic API Much better performance Support for encodings Extended Syntax Look-ahead (?=), (?!), look-behind (?<), (?<!) Named groups (?<>), backreferences, etc
  • 26. Regular Expressions Named Groups quot;His name is Joequot;.match(/name is (?<name>S+)/)[:name] # => quot;Joequot;
  • 27. Enumerable Enumerator built-in, returned from Enumerable methods (and those in Array, Dir, Hash, IO, Range, String or Struct that serve the same purposes). Added Enumerator#with_index Map with index %w(Joe John Jack).map.with_index do |name, offset| quot;#{name} is #{offset + 1}quot; end # => [quot;Joe is #1quot;, quot;John is #2quot;, quot;Jack is #3quot;]
  • 28. Enumerable reduce (inject) [1,2,3,4].reduce(:+) # => 10
  • 29. Enumerable New Enumerable methods take, group_by, drop, min_by, max_by, count, and others. take drop array = [1, 2, 3, 4, 5] array = [1, 2, 3, 4, 5] array.take(3) array.drop(3) # => [1, 2, 3] # => [4, 5] array array # => [1, 2, 3, 4, 5] # => [1, 2, 3, 4, 5]
  • 30. Hash Changes Insertion order preserved conferences = { euruko: 'Prague', scotland_on_rails: 'Edinburgh' } conferences[:railsconf_europe] = 'Berlin' conferences.each do |name, city| p quot;#{name} is in #{city}quot; end # quot;euruko is in Praguequot; # quot;scotland_on_rails is in Edinburghquot; # quot;railsconf_europe is in Berlinquot; conferences.delete(:scotland_on_rails) conferences[:scotland_on_rails] = 'Edinburgh' conferences.each do |name, city| p quot;#{name} is in #{city}quot; end # quot;euruko is in Praguequot; # quot;railsconf_europe is in Berlinquot; # quot;scotland_on_rails is in Edinburghquot;
  • 31. Object Added tap thing = Thing.new.tap do |thing| thing.something = 1 thing.something_else = 2 end
  • 32. Lambda Changes Obfuscation, ahoy! New literal syntax more flexible Not possible in { | | ... } style literals Passing blocks Default arguments m = ->(x, &b) { b.(x * 2) if b } ->(a, b=2) { a * b }.(3) m.(3) do |result| # => 6 puts result end # Output #6
  • 33. Symbol Changes Less sibling rivalry Added to_proc Added =~, [] like String (to_s less needed), sortable Object#methods, etc now return an array of symbols Indexing into Comparing with a String :foo[1] :this === quot;thisquot; # => true # => quot;oquot;
  • 34. Fibers “Semi-coroutines” Similar to Python’s generators Owe method naming lineage to Lua Out of scope of the talk, but very cool For some examples, see: http://pragdave.blogs.pragprog.com/pragdave/2007/12/pipelines-using.html (and follow-up) http://www.davidflanagan.com/blog/2007_08.html (older) Revactor project (Actors in 1.9 using Fibers + Threads) InfoQ, others...
  • 35. This was really just an introduction. Bruce Williams twitter: wbruce bruce@codefluency.com