ruby – 自定义attr_reader以执行属性的延迟实例化
发布时间:2020-12-17 03:19:03 所属栏目:百科 来源:网络整理
导读:(大编辑,我在那里的一部分……) 我一直在乱砍,我想出了这个,以便在读取属性之前指定需要完成的事情: class Class def attr_reader(*params) if block_given? params.each do |sym| define_method(sym) do yield self.instance_variable_get("@#{sym}") end
(大编辑,我在那里的一部分……)
我一直在乱砍,我想出了这个,以便在读取属性之前指定需要完成的事情: class Class def attr_reader(*params) if block_given? params.each do |sym| define_method(sym) do yield self.instance_variable_get("@#{sym}") end end else params.each do |sym| attr sym end end end end class Test attr_reader :normal attr_reader(:jp,:nope) { changethings if @nope.nil? } def initialize @normal = "Normal" @jp = "JP" @done = false end def changethings p "doing" @jp = "Haha!" @nope = "poop" end end j = Test.new p j.normal p j.jp 但改变并没有被认为是一种方法 – 任何人都有任何想法? 解决方法
您需要在实例的上下文中评估块.默认情况下,yield将在其本机环境中对其进行评估.
class Class def attr_reader(*params,&blk) if block_given? params.each do |sym| define_method(sym) do self.instance_eval(&blk) self.instance_variable_get("@#{sym}") end end else params.each do |sym| attr sym end end end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |