Ruby 2.0 Walkthrough: The Best Bits

Ruby 2.0 Walkthrough: The Best Bits

A quick overview of a few of the best bits in Ruby 2.0.

509e15b158eaac5ab3a5332a3f89d4a7?s=128

Peter Cooper

February 25, 2013
Tweet

Transcript

  1. RUBY 2.0 WALKTHROUGH

  2. The Best Bits THE RUBY 2.0 RUNTHROUGH

  3. A sprint, not a stroll

  4. BIG PARTS

  5. Refinements Experimental scope-limited monkey patching

  6. module FloatDivision refine Fixnum do def /(other); self.to_f / other;

    end end end class MathFun using FloatDivision def self.ratio(a, b) a / b end end p MathFun.ratio(6, 8) THE OLD IDEA (no longer works)
  7. module FloatDivision refine Fixnum do def /(other); self.to_f / other;

    end end end class MathFun using FloatDivision def self.ratio(a, b) a / b end end p MathFun.ratio(6, 8)
  8. module FloatDivision refine Fixnum do def /(other); self.to_f / other;

    end end end using FloatDivision class MathFun def self.ratio(a, b) a / b end end p MathFun.ratio(6, 8) Main context is OK
  9. Keyword Arguments definitely a: “pretty”, good: “addition”, to: “the language”

  10. def some_method(options = {}) defaults = { x: 10, y:

    20, z: 30 } options = defaults.merge(options) p options end some_method x: 1, y: 2
  11. def some_method(x: 10, y: 20, z: 30) p x, y,

    z end some_method x: 1, y: 2, z: 3
  12. def some_method(x: 10, **rest) p x, rest end some_method x:

    1, y: 2, z: 3, c: “x”
  13. Enumerator::Lazy Lazy enumeration, finally made easy.

  14. infinite_range = (0..Float::INFINITY) infinite_range.select { |num| num % 74 ==

    0 }
  15. infinite_range = (0..Float::INFINITY) e = infinite_range.lazy.select { |num| num %

    74 == 0 } puts e.next puts e.next puts e.next
  16. Module#prepend

  17. module Bar def my_method "inside the module" end end class

    Foo include Bar def my_method "inside the class" super end end x = Foo.new p x.my_method 1 2
  18. module Bar def my_method "inside the module" super end end

    class Foo prepend Bar def my_method "inside the class" end end x = Foo.new p x.my_method 1 2
  19. INCLUDE PREPEND Foo class Bar module x object NEITHER Foo

    class x object Object class Object class Foo class Bar module x object Object class
  20. DETAILS

  21. ABI Breakage Changes to the Application Binary Interface

  22. Regex engine changed From Oniguruma to Onigmo

  23. %{this\r\nis\n\ncool\vhello!}.gsub(/\R/, '')

  24. RubyGems 2.0 Lots of refactoring, initial support for stdlib gemification,

    gem search is now remote, arbitrary metadata support & more.
  25. RDoc 4.0 Adds Markdown support & ri can now show

    pages (e.g. READMEs with ri rdoc:README)
  26. %i and %I To form arrays of symbols, like %w

    does for words and arrays
  27. %i{a b c} == [:a, :b, :c] %I{ #{(rand(26) +

    65).chr} } == [:Y]
  28. UTF-8 is default source encoding No more # encoding: utf-8

    (if you don’t want)
  29. Bitmap garbage collector Faster, more efficient

  30. CSV.load and CSV.dump gone Not considered such a good idea

    in light of the early 2013 YAML vulnerabilities
  31. String#chars, #lines, #codepoints, etc. Now return arrays rather than enumerators.

    Use #each_char, #each_line, etc. instead if you need enumerators.
  32. TracePoint A more object oriented alternative to set_trace_func

  33. tracer = lambda do |event, file, line, id, binding, klass|

    to_display = [event, File.basename(file), line, klass, id] puts "%10s in %s at line %-2d %s:%s" % to_display end set_trace_func tracer # .. normal code here ..
  34. tracer = TracePoint.new do |tp| to_display = [tp.event, File.basename(tp.path), tp.lineno,

    tp.defined_class, tp.method_id] puts "%10s in %s at line %-2d %s:%s" % to_display end tracer.enable # .. normal code here ..
  35. respond_to? respond_to? against a protected method now returns false

  36. Method transplants with define_method Now accepts UnboundMethods

  37. module M def foo; "foo"; end end define_method :foo, M.instance_method(:foo)

    p foo
  38. Array#bsearch Range#bsearch Binary search for monotonic collections

  39. [1, 4, 9, 13, 14, 22, 40].bsearch { |i| p

    i; i >= 6 } # 13 # 4 # 9 # => 9 (1..1000).bsearch { |i| i > 372 }
  40. __dir__ Like __FILE__ but for the current source file’s directory

    Equivalent to File.dirname(File.realpath(__FILE__))
  41. to_h and Hash() A new convention. The hash equivalent to

    #to_a A key use is with Struct and OpenStruct
  42. User = Struct.new(:name, :age, :status) me = User.new("Peter", 31, :admin)

    me.to_h ENV.to_h Hash(nil) # => {} Hash([]) # => {}
  43. FIN https://cooperpress.com/