Ruby on Rails中的@变量


Answers:


426

title是局部变量。它们仅存在于其范围内(当前块)

@title 是实例变量-可供类中的所有方法使用。

您可以在此处阅读更多信息:http : //strugglingwithruby.blogspot.dk/2010/03/variables.html

在Ruby on Rails中-在控制器中将变量声明为实例变量(@title)使它们可用于视图。


4
感谢您的回答,还有后续问题...在我正在研究的一个类中,成员变量的初始构造类似于@options = {...}。不过,在此之后,类中的方法将访问该变量,并使用该变量进行函数调用,就像该变量是本地变量一样(即“ options.merge()”)。这只是不好的形式吗?还有其他语法语法吗?(例如,使变量保持沉默dup,或将其设为“ const”,使其无法被修改等)?我从C / C ++和Java的角度出发,真正模糊和可选的语法使我发疯!
Dan Devine

您的课程是否定义了具有相同名称@DanDevine的attr_accessor?attr_accessor是一种语法糖,可以为您生成一个getter \ setter。如果要获取不带@符号的值,则代码将接收该变量,因为它正在调用getter。请注意,这反过来是行不通的,如果要设置var,则需要显式使用@符号,否则将只设置本地var。这是好风格吗?很难说。我更喜欢在方法中使用getter语法,以防getter被覆盖-我喜欢尊重这种封装,即使在类本身内部也是如此。YMMV
Msencenb '19

30

@title当您希望变量在视图中可用时,请在控制器中使用。

解释是,这@title是一个实例变量,title是一个局部变量,并且rails使来自控制器的实例变量可用于视图。发生这种情况是因为模板代码(erb,halm等)在当前控制器实例的范围内执行。


谢谢你!这是唯一的解释,它解释了为什么控制器类中定义的@variables可以被视图中的代码拾取。
AlexC


14

@variables在ruby中称为实例变量。这意味着您可以在类内部的ANY METHOD中访问这些变量。[该类中的所有方法]

没有@符号的变量称为局部变量,这意味着您只能在THAT DECLARED METHOD中访问这些局部变量。限于本地范围。

实例变量示例:

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

在上述例子中@cust_id@cust_name@cust_addr在类内的另一方法来访问。但是使用局部变量将无法访问同一件事。


9

关于什么是可变作用域的教程很好地呈现了一些细节,只需在此处附上相关内容即可。


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+

4

局部变量只能在其初始化块内访问。此外,局部变量以小写字母(az)或下划线(_)开头。

实例变量是的实例self并以开头。@实例变量也属于对象本身。实例变量是您在ie .send等上执行方法的变量

例:

@user = User.all

@user是实例变量

未初始化的实例变量的值为 Nil


那么,这如何解释@title&之间的区别title
理查德·佩克

使用@title这样的实例变量,您可以在其上执行各种方法,而您不需要的局部变量
Joe Hilton

1
那么,这实际上如何解决了这个问题?看来您只是在引用一些教程。行动党想知道他是否应该使用@titletitle
理查德·佩克

因此,如果他们想执行任何方法(例如def new或def create等),则应使用实例变量
Joe Hilton

3
没有什么可以阻止您执行user = User.all并在user上执行方法,但这不是重点。
Jaro 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.