【问题标题】:Setting not initialized instance variable设置未初始化的实例变量
【发布时间】:2015-01-21 17:02:32
【问题描述】:

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

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

  def set_b(b)
    @b = b
  end
end

【问题讨论】:

    标签: ruby class coding-style instance-variables


    【解决方案1】:

    与其他语言相比,如果您不初始化实例变量,它将始终为 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】:

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

      attr_reader: 创建读取'a'的方法

      attr_writer: 创建写'a'的方法

      attr_accessor: 创建读写'a'的方法

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

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

      那么你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 2010-10-18
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 2011-03-18
        • 2010-11-26
        • 1970-01-01
        相关资源
        最近更新 更多