11. messages != méthodes
foo = "Bar"
foo.length
# Send :length to foo
foo.index("a")
# Send :index to foo with argument "a"
1+2
# Send :+ to object 1 with argument 2
a = Array.new
a[i]
# Send :[] to a with argument i
12. messages != méthodes
class VCR
def initialize
@messages = []
end
# Captures everything
def method_missing(method, *args, &block)
@messages << [method, args, block]
end
# Replays all captured messages
def play_back_to(obj)
@messages.each do |method, args, block|
obj.send(method, *args, &block)
end
end
end
15. Dynamique
Modifier des classes existantes
class Integer
def even?
(self % 2) == 0
end
end
class String
def url_friendly
self.downcase.gsub(/.../,'-').gsub(/-{2,}/,'-')
end
end
16. Dynamique
Méthodes singletons
class Dog
end
a_dog = Dog.new
anoher_dog = Dog.new
def a_dog.bark
"Waff Waff"
end
a_dog.bark # => "Waff Waff"
another_dog.bark # => NoMethodError
17. Dynamique
Hooks
class Tracing
def self.method_added(name)
puts "Method #{name} added to #{self.name} class."
end
def new_method
# Yada yada yada
end
end
18. Dynamique
Code Eval
class Module
def trace_attr(sym)
self.module_eval %{
def #{sym}
printf "Accessing %s with value %sn",
"#{sym}",
@#{sym}.inspect
@#{sym}
end
}
end
end
class Dog
trace_attr :name
def initialize(dog_name)
@name = dog_name
end
end
Dog.new("Fido").name
# => Accessing name with value "Fido"
19.
20. When I see a bird
- that walks like a duck
- and swims like a duck
- and quacks like a duck,
I call that bird a duck.
James Whitcomb Riley
21. Pas besoin dʼinterface !
class Duck
def talk; puts "Quack"; end
end
class DuckLikeObject
def talk; puts "Kwak"; end
end
flock = [ Duck.new, DuckLikeObject.new ]
flock.each do |d|
d.talk
end
24. DSL
(Rake)
desc "Clean active targets"
task :clean do
# ...
end
desc "Build the project"
task :build => :clean do
# ...
end
task :default => :build
25. desc "Clean active targets"
task :clean do
# ...
end
desc "Build the project"
task :build => :clean do
# ...
end
task :default => :build
def desc(description)
# ...
end
def task(*args, &block)
# ...
block.call
end
27. http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
Vous êtes libres de reproduire, distribuer et communiquer cette création au
public, ainsi que de modifier cette création
Paternité. Vous devez citer le nom de l'auteur original de la manière indiquée par l'auteur de
l'oeuvre ou le titulaire des droits qui vous confère cette autorisation (mais pas d'une manière qui
suggérerait qu'ils vous soutiennent ou approuvent votre utilisation de l'oeuvre).
Pas d'Utilisation Commerciale.Vous n'avez pas le droit d'utiliser cette création à des fins
commerciales.
Partage des Conditions Initiales à l'Identique. Si vous modifiez, transformez ou adaptez
cette création, vous n'avez le droit de distribuer la création qui en résulte que sous un contrat
identique à celui-ci.
Editor's Notes
Lancer irb
require &#xAB;blocks&#xBB;
require &#xAB;vcr&#xBB;
b = Builder::XmlMarkup.new
require &#x2018;extensions
require &#x2018;tracing&#x2019;
require &#x2018;module_tracing&#x2019;
require &#x2018;duck_typing&#x2019;
exemple geolocalisation
require &#x2018;mixins&#x2019;