在类中使用未初始化的实例变量并使用其他方法设置它们是否优雅?或者有更好的方法可以做到这一点?
class Klass
def initialize(a)
@a = a
end
def set_b(b)
@b = b
end
end
答案 0 :(得分: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)
答案 1 :(得分:0)
您的工作方式有效,但Ruby为此目的定义了attr_accessor
,attr_reader
和attr_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"