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.




blog comments powered by Disqus

 



Recommend me at Working with Rails
Leia a tradução do livro Getting Real
Info Online Blogs: Gestão 2.0