设置未初始化的实例变量

时间:2015-01-21 17:02:33

标签: ruby class coding-style instance-variables

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

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

  def set_b(b)
    @b = b
  end
end

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的工作方式有效,但Ruby为此目的定义了attr_accessorattr_readerattr_writer

attr_reader:创建方法以阅读&#39;

attr_writer:创建编写&#39; <#39;

的方法

attr_accessor:创建阅读和编写&#39;

的方法

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

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

然后你可以这样做:

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