【问题标题】:How do you initialize variables in Ruby?如何在 Ruby 中初始化变量?
【发布时间】:2010-09-06 06:22:49
【问题描述】:

以下变量的初始化方式有区别吗?

@var ||= []
@var = [] if @var.nil?
@var = @var || []

请分享您初始化变量的方式并说明优缺点。

【问题讨论】:

标签: ruby variables initialization memoization


【解决方案1】:

@var ||= []@var = @var || [] 相等,如果是 falsenil,则将 var 设置为 []

@var = [] if @var.nil? 更具体 - 仅当它等于 nil 时才会将 var 重新设置为 []

【讨论】:

  • 那么在|| 的情况下,rails 会自动检查@var 是否为空吗?或者.nil? 会是一个小小的开销吗?
  • 是的,所有这些示例都会检查nil。第一和第三也检查false
【解决方案2】:

如果您有警告(并且应该!),@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是否被定义,如果是nilfalse,你可以使用

@var = [] unless defined?(@var)

这不适用于局部变量,如 In Ruby why won't foo = true unless defined?(foo) make the assignment? 中所述

【讨论】:

  • 谢谢!我之前没有注意到警告信息。顺便说一句,如何在控制台中显示警告消息?我的没有显示。
  • 如果您使用的是 1.9.2 版本,irb -wirb -d 将打开警告(我不知道类似的 irb -v 是否会起作用)。对于早期版本,您必须自己设置$VERBOSE。 (irb -dworking 是 my bugfix 的结果,是另一个人的 SO 问题的结果)
猜你喜欢
  • 2012-06-15
  • 2013-09-21
  • 2011-06-21
  • 1970-01-01
  • 2017-11-30
  • 2010-10-16
  • 1970-01-01
  • 2017-04-05
  • 2019-05-17
相关资源
最近更新 更多