Decoradores em Ruby (migrando do Python)
Eu estou gastando hoje aprendendo Ruby de uma perspectiva Python. Uma coisa que eu não consegui lidar é um equivalente de decoradores. Para reduzir as coisas, estou tentando replicar um decorador Python trivial:
#! /usr/bin/env python import math def document(f): def wrap(x): print "I am going to square", x f(x) return wrap @document def square(x): print math.pow(x, 2) square(5)
Correndo isso me dá:
I am going to square 5 25.0
Então, eu quero criar um quadrado de função (x), mas decorá-lo para que ele me avise sobre o que vai ser quadrado antes de fazê-lo. Vamos nos livrar do açúcar para torná-lo mais básico:
... def square(x): print math.pow(x, 2) square = document(square) ...
Então, como faço para replicar isso em Ruby? Aqui está minha primeira tentativa:
#! /usr/bin/env ruby def document(f) def wrap(x) puts "I am going to square", x f(x) end return wrap end def square(x) puts x**2 end square = document(square) square(5)
Rodando isso gera:
./ruby_decorate.rb:8:in `document': wrong number of arguments (0 for 1) (ArgumentError) from ./ruby_decorate.rb:15:in `'
O que eu acho, porque parênteses não são obrigatórios e está tomando meu "wrap" de retorno como uma tentativa de "return wrap ()". Não conheço nenhuma maneira de me referir a uma função sem chamá-la.
Eu tentei várias outras coisas, mas nada me deixa longe.