我今天从 Python 的角度学习 Ruby。我完全无法解决的一件事是装饰器的等效项。为了简化事情,我尝试复制一个简单的 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 `<main>'
我想这是因为括号不是强制性的,它需要我的return wrap
作为一种尝试return wrap()
。我知道没有办法在不调用函数的情况下引用它。
我尝试过其他各种事情,但没有什么能让我走得更远。