在Ruby中,以下两个四种情况是否有区别?如果是这样,哪种更好的做法?Ruby返回实例变量的最佳做法,可能未定义
class OptionOne
def initialize(arr)
@arr = arr
end
def arr
@arr || []
end
end
class OptionTwo
def initialize(arr)
@arr = arr
end
def arr
(defined? @arr) ? @arr : []
end
end
第三个选项,按照伊利亚提到了Ruby风格指南:
class OptionThree
def initialize(arr)
@arr = arr
end
def arr
@arr ||= []
end
end
而且从基思·贝内特的回答第四个选项:
class OptionFour
attr_accessor :arr
def initialize(arr = [])
@arr = arr
end
end
你想用'@ arr'行做什么? –
这段代码没有办法用@arr初始化一个值,所以@arr总是为零(未定义)。另外,在OptionOne#arr中,你需要说'@ arr'(注意'@')。否则,函数会自动调用,直到出现堆栈溢出。 –
如果它只是一个空数组,你正在初始化变量,为什么不在构造函数中进行初始化,并避免所有这些?当初始化代价很高时(在时间,内存,其他资源等方面),延迟初始化的值(推迟初始化,直到需要时)。 –