Ruby
para programadores PHP
PHP

Perguntas iniciais

• Quem programa em PHP?


• Quem sabe o que é uma “variável variável”?


• Quem sabe o que é “paamayim nekudotayim”?


• Quem usa GOTO?
PHP

História

• Criada por Rasmus Lerdorf em 1994.


• Objetivo: Fazer um contador para a página pessoal de Rasmus.


• Originalmente era apenas uma biblioteca Perl.


• PHP3 escrito por Andi Gutmans e Zeev Suraski (Zend) em 1997/98
Ruby

História

• Criada por Yukihiro Matsumoto (Matz) em 1993.


• Objetivo: Criar uma linguagem poderosa que tenha uma “versão
  simplificada” de programação funcional com ótima OO.


• Matz: “I wanted a scripting language that was more powerful than Perl, and
  more object-oriented than Python. That's why I decided to design my own
  language”


• Matz: “I hope to see Ruby help every programmer in the world to be
  productive, and to enjoy programming, and to be happy. That is the
  primary purpose of Ruby language.”
PHP

Variáveis

$number = 18;
$string = “John”;
$bool = true;
$array = array(7,8,6,5);
$hash = array(“foo” => “bar”);
$obj = new Class(“param”);
Ruby

Variáveis

number = 18
string = “John”
another_string = %(The man said “Wow”)
bool = true
array = [7,8,6,5];
word_array = %w{hello ruby world}
hash = {:foo => ‘bar’} # new_hash = {foo:‘bar’}
obj = Class.new(“param”)

# news!

ages = 18..45 # range
cep = /^d{5}-d{3}$/ # regular expression
PHP

Paradigma

• Procedural com suporte a OO.


$a = array(1,2,3);
array_shift($a);
=> 1
array_pop($a);
=> 3
array_push($a, 4);
=> [2,4]
Ruby

Paradigma

• Procedural, totalmente OO com classes (Smalltalk-like), um tanto funcional
  com o conceito de blocos. Not Haskell thought.

a = [1,2,3]
a.shift
=> 1
a.pop
=> 3
a.push(4)
=> [2,4]
PHP

Tipagem

• Dinâmica e fraca.

10 + “10”;
=> 20
Ruby

Tipagem

• Dinâmica e forte. (Aberta a mudanças.)

10 + “10”
=> TypeError: String can't be coerced into Fixnum

class Fixnum
  alias :old_sum :+
  def + s
    old_sum s.to_i
  end
end
10 + “10”
=> 20
Ruby

Tipagem

• ...como???

1 + 1
=> 2

1.+(1)
=> 2

1.send(‘+’, 1)
=> 2

# “Operações”? Métodos!
PHP

Fluxo

• if, switch, ternário;

if($i == $j){ ... }

$i == $j ? ... : ...

switch($i){
  case(“valor”){
    TODO
  }
}
Ruby

Fluxo

• if, unless ...

if i == j
  ...
end

unless cond
  ...
end

puts “Maior” if age >= 18

puts “Menor” unless user.adult?
Ruby

Fluxo

• ...case...

# default usage
case hour
  when 1: ...
  when 2: ...
end

# with ranges!
case hour
  when 0..7, 19..23: puts “Good nite”
  when 8..12: puts “Good mornin’”
end
Ruby

Fluxo

• ...case...

# with regexes
case date
  when /d{2}-d{2}-d{4}/: ...
  when /d{2}/d{2}/d{4}/: ...
end

# crie seu próprio case
class MyClass
  def ===
    ...
  end
end
PHP

Iteradores

• while, for, foreach;

while($i < 10){ ... }

for($i = 0; $i < length($clients); $i++){ ... }

foreach($clients as $client){ ... }
Ruby

Iteradores

• for in, each, map, select, inject... enumeradores;

5.times{ ... }

[5,7,4].each{ ... }

[1,2,3].map{|i| i + 1 }
=> [2,3,4]

[16,19,22].select{|i| i >= 18 }
=> [19,22]

[5,7,8].inject{|s,i| s + i }
=> 20
Ruby

Iteradores / Blocos

• crie seu próprio iterador:

def hi_five
  yield 1; yield 2; yield 3; yield 4; yield 5
end

hi_five{|i| ... }
Ruby

Blocos

• power to the people.

File.open(“file”, “w”){|f| f.write(“Wow”) }

File.each_line(“file”){|l| ... }

Dir.glob(“*.png”){ ... }

“Ruby para programadores PHP”.gsub(/PHP/){|m| ... }

get “/” { ... } # sinatra

p{ span “Ruby is ”; strong “cool”   } # markaby
PHP

OO

• Herança comum, classes abstratas, interfaces. Como Java.
Ruby

OO

• Classes e módulos.

module Walker
  def walk
    ...
  end
end

# módulo como “herança múltipla” ou “mixin”
class Johny
  include Walker
end
Ruby

OO

• Classes e módulos.

# módulo como “namescope”
module Foo
  class Bar
    ...
  end
end



variable = Foo::Bar.new
PHP

OO Dinâmico

• __call: Chama métodos não existentes.


• __get: Chama “atributos” não existentes.


• __set: Chama ao tentar setar atributos não existentes;


$obj->metodo();

$obj->atributo;

$obj->atributo = “valor”;
Ruby

OO Dinâmico

• method_missing: Tudo em Ruby são chamadas de métodos.

obj.metodo # chama o método “metodo”

obj.atributo # chama o método “atributo”

obj.atributo = “valor” # chama o método “atributo=”

class Foo
  def method_missing m, *args
    ...
  end
end
Ruby

OO Dinâmico

• inherited...

# inherited
class Foo
  def self.inherited(subklass)
    ...
  end
end

class Bar < Foo
end
Ruby

OO Dinâmico

• included...

# included
module Foo
  def included(klass)
    ...
  end
end

class Bar
  include Foo
end
Ruby

OO Dinâmico

• class_eval, class_exec....

class Foo; end

Foo.class_eval(“def bar() ... end”)
Foo.class_exec{ def bar() ... end }

Foo.bar # works
Foo.baz # works
Ruby

OO Dinâmico

• instance_eval, instance_exec, define_method....

class Foo
  define_method(:bar) { ... }
  instance_exec{ def baz(); ... end }
  instance_eval(“def qux(); ... end”)
end



Foo.new.bar # works
Foo.new.baz # works
Foo.new.qux # works
Ruby

OO Dinâmico

• attr_(reader|accessor|writer)

class Foo
  attr_accessor :bar
end

# same as...
class Foo
  def bar() @bar end
  def bar= val
    @bar = val
  end
end
Ruby

OO Dinâmico

• nesting, alias, autoload, class_variable_(set|get|defined?), const_(get|set|
  defined?|missing), constanst, instance_(method|methods), method_(added|
  defined?|removed|undefined), remove_(class_variable|const|method),
  undef_method, and so much more...
PHP

Comunidade

• PECL, PEAR. ... PHP Classes?
Ruby

Comunidade

• RubyGems

gem install bundler # install gem

bundler gem my_gem # create my own gem

cd my_gem

rake release # that’s all folks

#also
bundler install # install all dependencies for a project
Ruby

Comunidade

• GitHub
Ruby para programadores PHP

Ruby para programadores PHP

  • 1.
  • 2.
    PHP Perguntas iniciais • Quemprograma em PHP? • Quem sabe o que é uma “variável variável”? • Quem sabe o que é “paamayim nekudotayim”? • Quem usa GOTO?
  • 3.
    PHP História • Criada porRasmus Lerdorf em 1994. • Objetivo: Fazer um contador para a página pessoal de Rasmus. • Originalmente era apenas uma biblioteca Perl. • PHP3 escrito por Andi Gutmans e Zeev Suraski (Zend) em 1997/98
  • 4.
    Ruby História • Criada porYukihiro Matsumoto (Matz) em 1993. • Objetivo: Criar uma linguagem poderosa que tenha uma “versão simplificada” de programação funcional com ótima OO. • Matz: “I wanted a scripting language that was more powerful than Perl, and more object-oriented than Python. That's why I decided to design my own language” • Matz: “I hope to see Ruby help every programmer in the world to be productive, and to enjoy programming, and to be happy. That is the primary purpose of Ruby language.”
  • 5.
    PHP Variáveis $number = 18; $string= “John”; $bool = true; $array = array(7,8,6,5); $hash = array(“foo” => “bar”); $obj = new Class(“param”);
  • 6.
    Ruby Variáveis number = 18 string= “John” another_string = %(The man said “Wow”) bool = true array = [7,8,6,5]; word_array = %w{hello ruby world} hash = {:foo => ‘bar’} # new_hash = {foo:‘bar’} obj = Class.new(“param”) # news! ages = 18..45 # range cep = /^d{5}-d{3}$/ # regular expression
  • 7.
    PHP Paradigma • Procedural comsuporte a OO. $a = array(1,2,3); array_shift($a); => 1 array_pop($a); => 3 array_push($a, 4); => [2,4]
  • 8.
    Ruby Paradigma • Procedural, totalmenteOO com classes (Smalltalk-like), um tanto funcional com o conceito de blocos. Not Haskell thought. a = [1,2,3] a.shift => 1 a.pop => 3 a.push(4) => [2,4]
  • 9.
    PHP Tipagem • Dinâmica efraca. 10 + “10”; => 20
  • 10.
    Ruby Tipagem • Dinâmica eforte. (Aberta a mudanças.) 10 + “10” => TypeError: String can't be coerced into Fixnum class Fixnum alias :old_sum :+ def + s old_sum s.to_i end end 10 + “10” => 20
  • 11.
    Ruby Tipagem • ...como??? 1 +1 => 2 1.+(1) => 2 1.send(‘+’, 1) => 2 # “Operações”? Métodos!
  • 12.
    PHP Fluxo • if, switch,ternário; if($i == $j){ ... } $i == $j ? ... : ... switch($i){ case(“valor”){ TODO } }
  • 13.
    Ruby Fluxo • if, unless... if i == j ... end unless cond ... end puts “Maior” if age >= 18 puts “Menor” unless user.adult?
  • 14.
    Ruby Fluxo • ...case... # defaultusage case hour when 1: ... when 2: ... end # with ranges! case hour when 0..7, 19..23: puts “Good nite” when 8..12: puts “Good mornin’” end
  • 15.
    Ruby Fluxo • ...case... # withregexes case date when /d{2}-d{2}-d{4}/: ... when /d{2}/d{2}/d{4}/: ... end # crie seu próprio case class MyClass def === ... end end
  • 16.
    PHP Iteradores • while, for,foreach; while($i < 10){ ... } for($i = 0; $i < length($clients); $i++){ ... } foreach($clients as $client){ ... }
  • 17.
    Ruby Iteradores • for in,each, map, select, inject... enumeradores; 5.times{ ... } [5,7,4].each{ ... } [1,2,3].map{|i| i + 1 } => [2,3,4] [16,19,22].select{|i| i >= 18 } => [19,22] [5,7,8].inject{|s,i| s + i } => 20
  • 18.
    Ruby Iteradores / Blocos •crie seu próprio iterador: def hi_five yield 1; yield 2; yield 3; yield 4; yield 5 end hi_five{|i| ... }
  • 19.
    Ruby Blocos • power tothe people. File.open(“file”, “w”){|f| f.write(“Wow”) } File.each_line(“file”){|l| ... } Dir.glob(“*.png”){ ... } “Ruby para programadores PHP”.gsub(/PHP/){|m| ... } get “/” { ... } # sinatra p{ span “Ruby is ”; strong “cool” } # markaby
  • 20.
    PHP OO • Herança comum,classes abstratas, interfaces. Como Java.
  • 21.
    Ruby OO • Classes emódulos. module Walker def walk ... end end # módulo como “herança múltipla” ou “mixin” class Johny include Walker end
  • 22.
    Ruby OO • Classes emódulos. # módulo como “namescope” module Foo class Bar ... end end variable = Foo::Bar.new
  • 23.
    PHP OO Dinâmico • __call:Chama métodos não existentes. • __get: Chama “atributos” não existentes. • __set: Chama ao tentar setar atributos não existentes; $obj->metodo(); $obj->atributo; $obj->atributo = “valor”;
  • 24.
    Ruby OO Dinâmico • method_missing:Tudo em Ruby são chamadas de métodos. obj.metodo # chama o método “metodo” obj.atributo # chama o método “atributo” obj.atributo = “valor” # chama o método “atributo=” class Foo def method_missing m, *args ... end end
  • 25.
    Ruby OO Dinâmico • inherited... #inherited class Foo def self.inherited(subklass) ... end end class Bar < Foo end
  • 26.
    Ruby OO Dinâmico • included... #included module Foo def included(klass) ... end end class Bar include Foo end
  • 27.
    Ruby OO Dinâmico • class_eval,class_exec.... class Foo; end Foo.class_eval(“def bar() ... end”) Foo.class_exec{ def bar() ... end } Foo.bar # works Foo.baz # works
  • 28.
    Ruby OO Dinâmico • instance_eval,instance_exec, define_method.... class Foo define_method(:bar) { ... } instance_exec{ def baz(); ... end } instance_eval(“def qux(); ... end”) end Foo.new.bar # works Foo.new.baz # works Foo.new.qux # works
  • 29.
    Ruby OO Dinâmico • attr_(reader|accessor|writer) classFoo attr_accessor :bar end # same as... class Foo def bar() @bar end def bar= val @bar = val end end
  • 30.
    Ruby OO Dinâmico • nesting,alias, autoload, class_variable_(set|get|defined?), const_(get|set| defined?|missing), constanst, instance_(method|methods), method_(added| defined?|removed|undefined), remove_(class_variable|const|method), undef_method, and so much more...
  • 31.
  • 32.
    Ruby Comunidade • RubyGems gem installbundler # install gem bundler gem my_gem # create my own gem cd my_gem rake release # that’s all folks #also bundler install # install all dependencies for a project
  • 33.