【发布时间】:2010-09-06 06:22:49
【问题描述】:
以下变量的初始化方式有区别吗?
@var ||= []
@var = [] if @var.nil?
@var = @var || []
请分享您初始化变量的方式并说明优缺点。
【问题讨论】:
标签: ruby variables initialization memoization
以下变量的初始化方式有区别吗?
@var ||= []
@var = [] if @var.nil?
@var = @var || []
请分享您初始化变量的方式并说明优缺点。
【问题讨论】:
标签: ruby variables initialization memoization
@var ||= [] 和 @var = @var || [] 相等,如果是 false 或 nil,则将 var 设置为 []
@var = [] if @var.nil? 更具体 - 仅当它等于 nil 时才会将 var 重新设置为 []
【讨论】:
|| 的情况下,rails 会自动检查@var 是否为空吗?或者.nil? 会是一个小小的开销吗?
nil。第一和第三也检查false
如果您有警告(并且应该!),@var ||= [] 的行为与 @var = @var || [] 不同:
irb(main):001:0> $VERBOSE = true
=> true
irb(main):002:0> @var ||= []
=> []
irb(main):003:0> @var2 = @var2 || []
(irb):3: warning: instance variable @var2 not initialized
=> []
irb(main):004:0>
如果你想检查@var是否被定义,如果是nil或false,你可以使用
@var = [] unless defined?(@var)
这不适用于局部变量,如 In Ruby why won't foo = true unless defined?(foo) make the assignment? 中所述
【讨论】:
irb -w 或 irb -d 将打开警告(我不知道类似的 irb -v 是否会起作用)。对于早期版本,您必须自己设置$VERBOSE。 (irb -dworking 是 my bugfix 的结果,是另一个人的 SO 问题的结果)