4. Criador
• Yukihiro Matsumoto (Matz)
• Japão, 1995
“I wanted a scripting language that was
more powerful than Perl, and more
object-oriented than Python3.”
Matz [1]
[1]
h&p://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html
9. Inspirações: Smalltalk
1.next
# => 2
Robot.methods
# => [:walk_to, ...]
"I always knew one day Smalltalk would
replace Java. I just didn't know it would be
called Ruby.”
Kent Beck [2]
[2]
h&p://onsmalltalk.com/objects-‐classes-‐and-‐constructors-‐smalltalk-‐style
10. Inspirações: Lisp
[1, 2, 3].map {|n| n*2}
# => [2, 4, 6]
[1, 2, 3].reduce do |acc, n|
acc + n
end
# => 6
11. Ruby
• Script
• Interpretada
• Tipagem forte e dinâmica
– Duck Typing
• Orientada a objetos
• Com características funcionais
43. Strings vs Symbols
color_str = "Orange"
color_sym = :Orange
if color_str == "Blue"
# ...
end
if color_sym == :Blue
# ...
end
44. Classe
class Robot
def initialize(name)
@name = name
end
def walk_to(x, y)
@engine.turn_on
@engine.go_to(x, y, $map)
@engine.turn_off
end
def self.build_evil_robot()
Robot.new("HAL")
end
end
45. Classe
class Robot
def initialize(name)
@name = name
end
def walk_to(x, y)
@engine.turn_on
@engine.go_to(x, y, $map)
@engine.turn_off
end
def self.build_evil_robot()
Robot.new("HAL")
end
end
46. Classe
class Robot
def initialize(name)
@name = name
end
def walk_to(x, y)
@engine.turn_on
@engine.go_to(x, y, $map)
@engine.turn_off
end
def self.build_evil_robot()
Robot.new("HAL")
end
end
47. Classe
class Robot
def initialize(name)
@name = name
end
def walk_to(x, y)
@engine.turn_on
@engine.go_to(x, y, $map)
@engine.turn_off
end
def self.build_evil_robot()
Robot.new("HAL")
end
end
48. Classe
class Robot
def initialize(name)
@name = name
end
def walk_to(x, y)
@engine.turn_on
@engine.go_to(x, y, $map)
@engine.turn_off
end
def self.build_evil_robot()
Robot.new("HAL")
end
end
49. Duck Typing
class Robot
def walk_to(x, y)
#...
end
def bip()
#...
end
end
class Person
def walk_to(x, y)
#...
end
def talk(msg)
#...
end
end
def go_to(obj, x, y)
obj.walk_to(x, y)
end
def bip(obj)
obj.bip()
end
go_to(Robot.new, 1, 2) # ok
go_to(Person.new, 1, 2) # ok
bip(Robot.new) # ok
bip(Person.new) # error
52. Getters & Setters
class Robot
def name
@name
end
def name=(n)
@name = n
end
def model
@model
end
def model=(m)
@model = m
end
#...
end
robot = Robot.new
robot.name = "HAL"
puts robot.name
54. Getters & Setters
class Accessor
def self.create_accessor(accessor_name)
define_method(accessor_name) do
instance_variable_get("@#{accessor_name}")
end
define_method("#{accessor_name}=") do |value|
instance_variable_set("@#{accessor_name}", value)
end
end
end
class Robot < Accessor
create_accessor :name
create_accessor :model
end
robot = Robot.new
robot.name = "HAL"
puts robot.name
55. Getters & Setters
class Object
def self.create_accessor(accessor_name)
define_method(accessor_name) do
instance_variable_get("@#{accessor_name}")
end
define_method("#{accessor_name}=") do |value|
instance_variable_set("@#{accessor_name}", value)
end
end
end
class Robot < Accessor
create_accessor :name
create_accessor :model
end
robot = Robot.new
robot.name = "HAL"
puts robot.name
56. Getters & Setters
class Object
def self.create_accessor(accessor_name)
define_method(accessor_name) do
instance_variable_get("@#{accessor_name}")
end
define_method("#{accessor_name}=") do |value|
instance_variable_set("@#{accessor_name}", value)
end
end
end
class Robot < Accessor
create_accessor :name
create_accessor :model
end
robot = Robot.new
robot.name = "HAL"
puts robot.name
57. Criando Métodos em Tempo de Execução
class Robot
def hello(name)
puts "Hello #{name}"
end
end
robot = Robot.new
robot.hello("IME")
# Hello IME
58. class Robot
def hello(name)
puts "Hello #{name}"
end
end
robot = Robot.new
robot.hello_ime
# => undefined
method
`hello_ime'
for
#<Robot:0x007ff3e9860c38>
(NoMethodError)
Criando Métodos em Tempo de Execução
59. class Robot
def hello(name)
puts "Hello #{name}"
end
def method_missing(method_name)
name = method_name.to_s.gsub("hello_", "")
hello(name.upcase)
end
end
robot = Robot.new
robot.hello_ime
# => Hello IME
robot.hello_igor
# => Hello IGOR
Criando Métodos em Tempo de Execução
60. Active Record
class Group < ActiveRecord::Base
# ...
end
class Posts < ActiveRecord::Base
# ...
end
class User < ActiveRecord::Base
has_many :posts
belongs_to :group
end
user = User.find_by(name: 'Ígor Bonadio')
user.posts # => [...]
user.group.name # => IME
61. RSpec
RSpec.describe User, :type => :model do
it "orders by last name" do
lindeman = User.create!(first_name: "Andy",
last_name: "Lindeman")
chelimsky = User.create!(first_name: "David”,
last_name: "Chelimsky")
expect(User.ordered_by_last_name).to eq([chelimsky,
lindeman])
end
end