ao infinito... e além!
    Ruby 2.0
Traits
module Logger
  def log(message)
    puts message
  end
end
class ComplexBusiness
  include Logger
  # ...
end
ComplexBusiness.ancestors
# => [ComplexBusiness, Logger, ...]
module Logger
  def log(message)
    puts message
  end
end
class ComplexBusiness
  mix Logger
  # ...
end
ComplexBusiness.ancestors
# => [ComplexBusiness, Object, ...]
module Extra; end
module More; end
class ComplexBusiness
  include Extra
end
module Extra
  include More
end
ComplexBusiness.ancestors
# => [ComplexBusiness, Extra, Object, ...]
Extra.ancestors
# => [Extra, More]
module Logger               module EmailNotification
  def error(message)          def error(message)
    puts "ERROR #{message}"     # send mail ...
  end                         end
  def info(message)         end
    puts "INFO #{message}"
  end
end
class ComplexBusiness
  include Logger
  include EmailNotification
end
class ComplexBusiness
  mix Logger
  mix EmailNotification # exception!
end
class ComplexBusiness
  mix Logger, :error => :log_error
  mix EmailNotification
end
class ComplexBusiness
  mix Logger, :error => nil
  mix EmailNotification
end
Method Combination
class ComplexBusiness
  def log(message)
    puts message
  end
end
module Formatter
  def log(message)
    original_log("*** #{message} ***")
  end
end


class ComplexBusiness
  def log(message)
    puts message
  end
end
module Formatter
  def log(message)
    original_log("*** #{message} ***")
  end
end

class ComplexBusiness
  def log(message)
    puts message
  end
  include Formatter
end
module Formatter
  def log(message)
    original_log("*** #{message} ***")
  end
end
    alias_method_chain ?
class ComplexBusiness
  def log(message)
    puts message
  end
  include Formatter
end
module Formatter
  def log(message)
    original_log("*** #{message} ***")
  end
end

class ComplexBusiness
  def log(message)
    puts message
  end
  mix Formatter
end
module Formatter
  def log(message)
    super("*** #{message} ***")
  end
end

class ComplexBusiness
  def log(message)
    puts message
  end
  mix Formatter, :log => []
end
module Formatter
  def log(message)
    super("*** #{message} ***")
  end
end

class ComplexBusiness
  def log(message)
    puts message
  end
  prepend Formatter
end
ComplexBusiness.ancestors
# => [Formatter, ComplexBusiness, ...]
**kwargs
transfer amount: 100,
         from: company,
         to: employee
transfer amount: 100,
         from: company,
         to: employee
 def transfer(hash)
   value = hash[:amount]
   source = hash[:from]
   destination = hash[:to]
   # do the transfer ...
 end
transfer amount: 100,
         from: company,
         to: employee

def transfer(amount: value,
             from: source,
             to: destination)
  # do the transfer ...
end
Refinements
require "rspec"

describe RSpecWithRefinements do
  it "patches objects only inside this block" do
    "some string".should respond_to(:should_not)
    1234.should respond_to(:should_not)
  end
end

1234.should # error!
refine Klass {}

using Namespace

escopo léxico

herança, class_eval,
module_eval, instance_eval
Ruby ISO
standardization
Rite
embedding Ruby
Dúvidas?




   fabio.kung@gmail.com
fabio.kung@locaweb.com.br      Obrigado!
http://twitter.com/fabiokung

Ruby 2.0: to infinity... and beyond!

  • 1.
    ao infinito... ealém! Ruby 2.0
  • 3.
  • 4.
    module Logger def log(message) puts message end end class ComplexBusiness include Logger # ... end ComplexBusiness.ancestors # => [ComplexBusiness, Logger, ...]
  • 5.
    module Logger def log(message) puts message end end class ComplexBusiness mix Logger # ... end ComplexBusiness.ancestors # => [ComplexBusiness, Object, ...]
  • 6.
    module Extra; end moduleMore; end class ComplexBusiness include Extra end module Extra include More end ComplexBusiness.ancestors # => [ComplexBusiness, Extra, Object, ...] Extra.ancestors # => [Extra, More]
  • 7.
    module Logger module EmailNotification def error(message) def error(message) puts "ERROR #{message}" # send mail ... end end def info(message) end puts "INFO #{message}" end end
  • 8.
    class ComplexBusiness include Logger include EmailNotification end
  • 9.
    class ComplexBusiness mix Logger mix EmailNotification # exception! end
  • 10.
    class ComplexBusiness mix Logger, :error => :log_error mix EmailNotification end
  • 11.
    class ComplexBusiness mix Logger, :error => nil mix EmailNotification end
  • 12.
  • 13.
    class ComplexBusiness def log(message) puts message end end
  • 14.
    module Formatter def log(message) original_log("*** #{message} ***") end end class ComplexBusiness def log(message) puts message end end
  • 15.
    module Formatter def log(message) original_log("*** #{message} ***") end end class ComplexBusiness def log(message) puts message end include Formatter end
  • 16.
    module Formatter def log(message) original_log("*** #{message} ***") end end alias_method_chain ? class ComplexBusiness def log(message) puts message end include Formatter end
  • 17.
    module Formatter def log(message) original_log("*** #{message} ***") end end class ComplexBusiness def log(message) puts message end mix Formatter end
  • 18.
    module Formatter def log(message) super("*** #{message} ***") end end class ComplexBusiness def log(message) puts message end mix Formatter, :log => [] end
  • 19.
    module Formatter def log(message) super("*** #{message} ***") end end class ComplexBusiness def log(message) puts message end prepend Formatter end
  • 20.
  • 21.
  • 22.
    transfer amount: 100, from: company, to: employee
  • 23.
    transfer amount: 100, from: company, to: employee def transfer(hash) value = hash[:amount] source = hash[:from] destination = hash[:to] # do the transfer ... end
  • 24.
    transfer amount: 100, from: company, to: employee def transfer(amount: value, from: source, to: destination) # do the transfer ... end
  • 25.
  • 27.
    require "rspec" describe RSpecWithRefinementsdo it "patches objects only inside this block" do "some string".should respond_to(:should_not) 1234.should respond_to(:should_not) end end 1234.should # error!
  • 28.
    refine Klass {} usingNamespace escopo léxico herança, class_eval, module_eval, instance_eval
  • 29.
  • 30.
  • 31.
    Dúvidas? fabio.kung@gmail.com fabio.kung@locaweb.com.br Obrigado! http://twitter.com/fabiokung