繁体   English   中英

为什么在html.erb中未声明的@variables为nil而不是NameError

[英]Why are undeclared @variables nil in html.erb and not a NameError

如果渲染的html.erb文件没有在控制器中分配变量(例如@user = params["user_name"] )那么为什么它将@user视为nil而不是抛出NameError: undefined local variable

例如:

<%= render partial: "greeting", locals: { user: @user } if @user %>

如果控制器将其传递给@user ,这将呈现问候语,但如果页面是第一次呈现并且用户尚未输入其用户名,则问候语将不会出现,而不是导致错误。 在我看来, @user永远不会在html.erb执行的本地范围内声明,因此它应该导致错误。

这里发生了什么事? 也许@以某种方式预处理意味着将变量视为符号并将其用作params哈希中的键并返回结果?

未初始化的实例变量( @... )计算为nil 您仍然可以使用defined?检查是否已分配实例变量(包括赋值为nildefined? 方法:

[1] pry(main)> defined? @test
=> nil
[2] pry(main)> @test = nil
=> nil
[3] pry(main)> defined? @test
=> "instance-variable"

那么为什么它将@user视为nil而不是抛出NameError: undefined local variable

好吧,它不是局部变量,它是一个实例变量。

但即使局部变量的行为方式也是一样的:

if false
  local_var = 42 # needed so Ruby knows `local_var` isn't a method call
end

local_var
# => nil

@instance_variable
# => nil

$global_variable
# => nil

但奇怪的是:

Constant
# NameError: uninitialized constant Constant

@@class_variable
# NameError: uninitialized class variable @@class_variable in Object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM