如何无需重复前缀实例名,调用同一实例的多个方法?
如何无需重复实例名前缀调用同一实例的多个方法
当然可以!在Ruby中,有几种实用的技巧能帮你摆脱重复输入实例名的麻烦,直接在目标实例的上下文中调用多个方法。下面是两种最常用的方案:
1. 使用 instance_eval 方法
instance_eval 会将代码块的执行上下文切换到目标实例内部,这样块里的所有方法调用都会默认指向该实例,无需再加前缀。
把你的代码改成这样:
logger = Logger.new(STDERR) table_name = ENV['ec2_information'].split('/')[1] discovery = Ec2_ddb_discovery.new(logger:, table: table_name) discovery.instance_eval do scan_ddb_table collect_stale_items.each { |item| # 这里写你处理item的逻辑 } end
2. 使用 tap 方法(更优雅的链式调用)
tap 方法会把实例本身传入代码块,执行完块后还会返回实例。虽然块里需要用参数指代实例,但你可以用一个极短的变量名(比如d),或者在Ruby 2.7+版本中省略参数直接用self指代,同样能大幅减少重复代码:
带参数的写法
logger = Logger.new(STDERR) table_name = ENV['ec2_information'].split('/')[1] Ec2_ddb_discovery.new(logger:, table: table_name).tap do |d| d.scan_ddb_table d.collect_stale_items.each { |item| # 处理item的逻辑 } end
Ruby 2.7+ 省略参数的简写
logger = Logger.new(STDERR) table_name = ENV['ec2_information'].split('/')[1] Ec2_ddb_discovery.new(logger:, table: table_name).tap do scan_ddb_table collect_stale_items.each { |item| # 处理item的逻辑 } end
小提示
instance_eval更适合需要直接访问实例内部私有方法/变量的场景;tap则偏向链式调用风格,代码可读性更强,也更符合Ruby的惯用写法。
内容的提问来源于stack exchange,提问作者Jason Parmar
相关产品推荐
相关产品推荐

