Декораторы в 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
Итак, я хочу создать квадрат функции (x), но украсить его, чтобы он предупреждал меня о том, что этособирается выйти на круги своя прежде, чем это сделает. Позволять's избавиться от сахара, чтобы сделать его более простым:
... 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 `'
Что я думаю, потому что скобки нет обязательно и этоберу "обратная упаковка " как попыткаreturn wrap () ", Я не знаю способа ссылаться на функцию, не вызывая ее.
Я пробовал разные вещи, но ничего не получилось.