加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby中的实例变量初始化

发布时间:2020-12-17 04:20:32 所属栏目:百科 来源:网络整理
导读:我想在尝试理解 Ruby中的实例变量时我会有点疯狂.我唯一的目标是确保为给定类创建的每个对象都有一个具有预定值的变量,而无需为该类编写初始化方法.就像是: class Test @my = [] attr_accessor :myendt = Test.newt.my # I want [] but this shows nil 是否
我想在尝试理解 Ruby中的实例变量时我会有点疯狂.我唯一的目标是确保为给定类创建的每个对象都有一个具有预定值的变量,而无需为该类编写初始化方法.就像是:
class Test

  @my = []

  attr_accessor :my

end
t = Test.new
t.my # I want [] but this shows nil

是否可以在不触及初始化的情况下实现此目的?谢谢.

编辑:为了澄清,我正在编写一些代码,这些代码将被执行类似于attr_accessor,因为它会将实例变量添加到执行它的类中.如果我自己编写初始化文件,我最终会破坏用户编写的文件.

解决方法

你正在做的是在类级别定义一个实例变量(因为类是Class类的实例,这样可以正常工作).

不,没有办法初始化.

编辑:您在编辑中有一点误解. attr_accessor不会向类添加实例变量.从字面上看,它的作用是什么(使用我的例子):

def my; @my; end
def my=(value); @my = value; end

它不主动创建/初始化任何实例变量,它只定义了两个方法.你可以使用define_method编写自己的类方法来完成类似的事情.

编辑2:

为了进一步说明如何编写这样的方法:

class Module
  def array_attr_accessor(name)
    define_method(name) do
      if instance_variable_defined?("@#{name}")
        instance_variable_get("@#{name}")
      else
        instance_variable_set("@#{name}",[])
      end
    end

    define_method("#{name}=") do |val|
      instance_variable_set("@#{name}",val)
    end
  end
end


class Test
  array_attr_accessor :my
end

t = Test.new
t.my # => []
t.my = [1,2,3]
t.my # => [1,3]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读