如何在Ruby中实现支持代码块初始化的可调用属性on_start
Ruby中通过代码块设置回调属性的实现
你要实现的是**回调(Callback)**模式,核心是把代码块转换成Proc对象保存,后续触发执行。默认的attr_accessor生成的setter方法无法直接接收代码块,需要自定义方法来处理:
基础实现代码
class SchedulingManager # 自定义on_start方法,接收代码块并保存为Proc对象 def on_start(&block) @on_start = block end def call # 执行保存的代码块,先判断是否存在避免空调用报错 @on_start.call if @on_start end end # 使用示例 scheduling = SchedulingManager.new scheduling.on_start do puts "hello" end scheduling.call # 输出: hello
扩展优化(支持属性读取)
如果需要同时支持读取on_start属性,可以调整为:
class SchedulingManager attr_reader :on_start def on_start(&block) @on_start = block if block_given? @on_start end def call on_start.call if on_start end end
原理说明
- 方法参数前加
&符号,会把传入的代码块自动转换成Proc对象 - 保存这个
Proc后,通过call方法就能执行代码块内的逻辑 - 这种模式在Ruby生态中很常见,比如Rails的生命周期回调、各类框架的事件监听都基于类似思路
内容的提问来源于stack exchange,提问作者Dedy Puji
相关产品推荐
相关产品推荐

