“ @var || = 123”和“如果定义则返回@var?(@ var); @var = 123”之间有什么区别?

时间:2019-11-17 14:07:29

标签: ruby-on-rails ruby heroku ruby-2.6

我在本地计算机上使用ruby 2.6.5。我还在heroku机器上使用了相同的红宝石版本。

但是我在使用heroku时遇到了奇怪的错误。

如果我定义了类似的方法:

def current_admin
  @current_admin ||= 'yana'
end

它在我的机器上完美运行,在heroku上将引发NameError:

NameError (`@` is not allowed as an instance variable name)

但是我什么时候做:

def current_admin
  return @current_admin if defined?(@current_admin)
  @current_admin = 'yana'
end

在两台机器上都可以使用。

heroku上导致第一种语法失败的区别到底是什么?

*更新*

我所做的使它在heroku上起作用的差异。

   def current_account
-    @current_account ||= AccountSession.find
+    return @current_account if defined? @current_account
+
+    @current_account = AccountSession.find
   end

1 个答案:

答案 0 :(得分:3)

我对Heroku的毛刺一无所知,但以下是区别的答案。

@current_admin ||= 42

上面的行与@current_admin = @current_admin || 42完全等效。就是说,当42@current_admin(又名falseyfalse时,该值将重置为nil

@defined将重置值,并且仅当此实例变量先前未在当前范围内声明时。即使nil也会像以前明确设置的那样保持原样。

defined? @current_admin
#⇒ nil
@current_admin = nil
defined? @current_admin
#⇒ "instance-variable"