设置未初始化的实例变量

Setting not initialized instance variable

在 class 中使用未初始化的实例变量并使用其他方法设置它们是否优雅?或者有更好的方法吗?

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

  def set_b(b)
    @b = b
  end
end

您的操作方式有效,但 Ruby 为此目的定义了 attr_accessorattr_readerattr_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"

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

只要Klass的其他方法不依赖于实际有值的实例变量,这样就可以了。

至于getter和setter,有attr_accessorattr_readerattr_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)