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:
ruby# func_composition.rb
class Proc
def self.compose(f, g)
lambda { |args| f[g[args]] }
end
def *(g)
Proc.compose(self, g)
end
end
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
E é só isso: --- ruby$ 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?