Декораторы в Ruby (переход с Python)

Я трачу сегодня на изучение Ruby с точки зрения Python. Одна вещь, с которой я полностью не смог разобраться, это эквивалент декораторов. Чтобы урезать ситуацию, я пытаюсь воспроизвести тривиальный декоратор Python:

#! /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)

Запуск этого дает мне:

I am going to square 5
25.0

Итак, я хочу создать функцию square (x), но украсить ее, чтобы она предупредила меня о том, что она собирается возвести в квадрат, прежде чем она это сделает. Давайте избавимся от сахара, чтобы сделать его более простым:

...
def square(x):
    print math.pow(x, 2)
square = document(square)
...

Итак, как мне воспроизвести это в Ruby? Вот моя первая попытка:

#! /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)

Запуск этого генерирует:

./ruby_decorate.rb:8:in `document': wrong number of arguments (0 for 1) (ArgumentError)
    from ./ruby_decorate.rb:15:in `'

Что я и думаю, потому что круглые скобки не являются обязательными, и он принимает мою «возвратную переноску» как попытку «возвратной переноски ()». Я не знаю способа ссылаться на функцию без ее вызова.

Я пробовал разные вещи, но ничто не уводит меня далеко.

Ответы на вопрос(11)

Ваш ответ на вопрос