【发布时间】: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
在未初始化的类中使用实例变量并使用其他方法设置它们是否优雅?或者也许有更好的方法来做到这一点?
class Klass
def initialize(a)
@a = a
end
def set_b(b)
@b = b
end
end
【问题讨论】:
标签: ruby class coding-style instance-variables
与其他语言相比,如果您不初始化实例变量,它将始终为 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)
【讨论】:
你这样做的方式是可行的,但 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"
【讨论】: