Sep
07
Tradução: Compondo Funções em Ruby
on September 07, 2007
publicado por Tom Moertel em 07/04/06
Uma das coisas que eu sinto falta quando codifico em Ruby são composições baratas de função. Em Haskel, por exemplo, eu posso compor funções usando o operador ponto (.):
1 2 3 4 |
inc = (+1) twice = (*2) twiceOfInc = twice . inc |
Por causa das classes abertas de Ruby, entretanto, eu posso facilmente adicionar essa funcionalidade à linguagem. No código abaixo, eu apresento Proc.compose e sobreponho o operador asterisco (*) para o propósito:
1 2 3 4 5 6 7 8 9 |
# func_composition.rb class Proc def self.compose(f, g) lambda { |*args| f[g[*args]] } end def *(g) Proc.compose(self, g) end end |
E é só isso:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ irb -r func_composition.rb irb(main):001:0> inc = lambda { |x| x + 1 } => #<Proc:0x00002aaaaaad7810@(irb):1> irb(main):002:0> twice = lambda { |x| x * 2 } => #<Proc:0x00002aaaaabd2d18@(irb):2> irb(main):003:0> inc[1] => 2 irb(main):004:0> twice[2] => 4 irb(main):005:0> twice_of_inc = twice * inc => #<Proc:0x00002aaaaab32458@./func_composition.rb:3> irb(main):006:0> twice_of_inc[1] => 4 irb(main):007:0> twice_of_inc[2] => 6 |
Agora, como isso não é revigorador?
Gostou deste artigo? Considere fazer uma doação ao site.





