I love Ruby! But as in any relationship, to love means that you (often) have to accept the “dark side” too! Ruby is human in nature and has a lot of gotchas, tricks, wierdness and sometimes scary features that I plan to highlight. This talk aims to provide the “Ah-ha!” moments when working in Ruby.
This talk is for beginners and experts alike – in fact, I tag slides to mark their level and beginners can choose to tune out of the heavy stuff!
8. Base Conversions
$ irb> 12345.to_s(8)
=> "30071"
# => Octal
$ irb> 12345.to_s(36)
=> "9ix"
# That is an actual number
$ irb> 1234.to_s(64)
=> ArgumentError: invalid radix 64
13. Calling out to Stabby
blk = ->(f, *m, sl, l) do
puts sl
end
blk.call(1, 2, 3, 4, 5, 6)
=> 5
blk.(1, 2, 3, 4, 5, 6)
=> 5
call is implied for a stabby
proc or a Proc
14. The Case Statement
def multiple_of(factor)!
Proc.new {|p| p.modulo(factor).zero?}!
end!
!
number = 9!
case number!
when multiple_of(3)!
puts "Multiple of 3"!
when multiple_of(7)!
puts "Multiple of 7"!
end
15. Behind every case is a ===
number = 9!
case number !
when multiple_of(3)
Proc.new {|p| p.modulo(3).zero?} === 9
Proc#=== is an alias to Proc#call.
Proc.new { |p| !
p.modulo(3).zero?!
}.call(9)
21. The curry recipe
pull = jackpot.curry[rand(5)]
=> #<Proc:0x007f9eec0990b0 (lambda)>
•
Return lambda till all parameters are passed.
•
Evaluate the block if all parameters are passed.
2.times { pull = pull.curry[rand(5)] }
=> true # or false
22. So! So you think you can tell…
Protected from Private
24. The elusive include
class Base!
include Mongoid::Document!
end
Private method!
Instance method !
Defined the class Module
25. Protected methods
•
Work with objects not classes.
•
Invoke a protected method on
another object in the same lineage
What the …
26. class Autobot
def initialize(nick); @nick = nick; end
!
protected
attr_accessor :nick
end
!
prime = Autobot.new("Optimus Prime")
p prime.nick
protected method `nick' called for
#<Autobot:0x007f92ba082330 @nick="Optimus
Prime"> (NoMethodError)
27. class Autobot
def fights(target)
p "I am #{self.nick}"
p "Kicking #{target.nick}'s ass"
end
protected
attr_accessor :nick
end
!
prime = Autobot.new("Optimus Prime")
megatron = Autobot.new('Megatron')
!
prime.fights megatron
"I am Optimus Prime"
"Kicking Megatron's ass"
29. Keywords - hmm…
class Serious
def true
false
end
def false
true
end
end
die = Serious.new
p "seriously!" if die.false
30. Cherry pick from Modules
module Megatron!
def power!
p "Megatron's super strength"!
end!
!
def evil!
p 'Evil genius'!
end!
end
31. Cherry pick from Modules
class Hanuman!
include Megatron!
end
Hanuman.new.power!
# => "Megatron's super strength"!
Hanuman.new.evil !
# => "Evil genius" # Oh no!
32. Cherry pick from Modules
class Hanuman!
def power!
Megatron.instance_method(:power).!
bind(self).call!
end!
end
Hanuman.new.power!
# => "Megatron's super strength"!
Hanuman.new.evil !
# => undefined method `evil’...>