代码之家  ›  专栏  ›  技术社区  ›  user4252294

设置未初始化实例变量

  •  2
  • user4252294  · 技术社区  · 10 年前

    在类中使用未初始化的实例变量,并使用其他方法设置它们,这是否优雅?或者也许有更好的方法来做到这一点?

    class Klass
      def initialize(a)
        @a = a
      end
    
      def set_b(b)
        @b = b
      end
    end
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   mhutter    10 年前

    与其他语言不同,如果不初始化实例变量,它将始终 nil (而在某些其他语言中,你可能会得到一些未定义的东西)。

    只要其他方法 Klass 不要依赖于实际具有值的实例变量,这应该是可以的。

    至于getter和setter,有 attr_accessor , attr_reader attr_writer (参见 the docs ).

    class Klass
      attr_accessor :b
      # there's also attr_reader and attr_writer
    
      def initialize(a)
        @a = a
      end
    end
    
    k = Klass.new :foo
    k.b = :bar
    
    k.b
    #=> :bar
    
    k.a
    #=> undefined method `a' for #<Klass:0x007f842a17c0e0 @a=:foo, @b=:bar> (NoMethodError)
    
        2
  •  0
  •   Jérôme    10 年前

    你这样做是可行的,但Ruby定义了 attr_accessor , attr_reader attr_writer 为此目的。

    属性阅读器 :创建读取“a”的方法

    属性编写器 :创建方法以写入“a”

    属性访问器 :创建读取和写入“a”的方法

    我认为最好的方法是使用 attr_accessor:a

    class Klass
      attr_accessor:a
      def initialize(a)
        @a = a
      end
    end
    

    然后您可以执行以下操作:

    k = Klass.new "foo" #example 
    k.a = "bar"