假设有以下两个方法需要使用数据库
def add(var1,var2,str)
"add方法使用数据库"
end
def count(var)
"count方法使用数据库"
end
为了方便统一配置,我们用一个hook函数配置数据库信息,之后调用hook函数就自动在执行以上方法前配置好数据库了
def before_execute_function_add(var1,var2,str)
puts "连接数据库" # 假设这部分是必须内容
puts "各种配置和预处理"
add(var1,var2,str)
end
def before_execute_function_count(var)
puts "连接数据库" # 假设这部分是必须内容
puts "各种配置和预处理"
count(var)
end
# 可以发现这种写法很重复。
# 如果有更多的方法,是不是每个都这样配置呢?显然这里不能简单地重载方法,因为内部方法名都改了。
before_execute_function_add(2,3,"abc")
before_execute_function_count(2)
在ruby中,可以使用可变长度参数和块来实现这个功能的简化:
def before_execute_function(*var)
puts "连接数据库" # 假设这部分是必须内容
puts "各种配置和预处理"
yield(*var)
end
# *[参数]表示这里的参数数量是可变的
# yield这里会执行后面传进来的块
before_execute_function(2){|var| count(var)}
before_execute_function(2,3,"abc"){|var1,var2,var3| add(var1,var2,var3)}
# 上下两种方式是等价的,但是下面一种只需要一个hook函数,
#而且之后就算有再多的方法需要用掉这个hook函数都只需要在调用时自定义块就好了,相比上面的实现方式代码简洁多了。也更加符合元编程的思想。