Array
array = %w(hello world) # => ["hello", "world"]
Number
"%.2f" % 10 # => "10.00"
"%.2f €" % 10 # => "10.00 €"
Eval
a, b = [1, 2] , 3
eval("a << b") # => [1, 2, 3]
Multiline string
string = <<-STRING
Hello John
How are you today ?
Goodbye
STRING
# => "Hello John\nHow are you today ?\nGoodbye\n"
Case
case year
when 1970..1979: "disco"
when 1980..1989: "eighties"
when 1990..1999: "dance"
else "RnB"
end
Dynamic dispatch
object.send(:my_method)
Dynamic method
define_method(:my_method) do |foo, bar| # or even |*args|
# do something
end
# est équivalent
def my_method(foo, bar)
# do something
end
['draft','waiting','paid'].each do |status|
define_method("#{status}?") { self.status == status }
end
Chercher des méthodes dans une classe
String.instance_methods # => [:encode, :encode!, :include?, :%, :*, :+, :count, ...]
String.instance_methods(false) # sans les méthodes héritées
String.instance_methods(false).grep(/what/) # => [:count]
Les procs pour transformer un bloc en code
stringify = proc { |object| object.to_s }
(1..10).map(&stringify) # => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
Lambda
[1, 2, 3].map { _1 + 3 }
=> [4, 5, 6]
User.new.method(:confirmed?).source.display
User.instance_method(:confirmed?).source.display
# will print
def confirmed?
!!confirmed_at
end
User.new.method(:active?).source_location
# ["/Users/alexandrebouvier/my_app/app/models/user.rb", 63]
Pattern Matching (voir article)
def greet(hash = {})
case hash
in {greeting: greeting, first_name: first_name, last_name: last_name}
greet(greeting: greeting, name: "#{first_name} #{last_name}")
in {greeting: greeting, name: name}
puts "#{greeting}, #{name}"
in {name: name}
greet(greeting: "Hello", name: name)
in {greeting: greeting}
greet(greeting: greeting, name: "Anonymous")
else
greet(greeting: "Hello", name: "Anonymous")
end
end
greet # Hello, Anonymous
greet(name: "John") # Hello, John
greet(first_name: "John", last_name: "Doe") # Hello, John Doe
greet(greeting: "Bonjour", first_name: "John", last_name: "Doe") # Bonjour, John Doe
greet(greeting: "Bonjour") # Bonjour, Anonymous
Ruby lookup method of last resort
def method_missing; end
Erreurs
begin
# someting that may fail
rescue
# someting to execute in case of failure
else
# someting to execute in case of success
ensure
# something that will always execute
end
Structure d’une gem
gem_name/
├── bin/
│ └── gem_name
├── lib/
│ └── gem_name.rb
├── test/
│ └── test_gem_name.rb
├── README
├── Rakefile
└── gem_name.gemspec
!
, *
, &
, etc.)+
, -
, ||=
, etc.)condition ? true : false