了解Ruby变量和符号?

Sam*_*and 4 ruby syntax ruby-on-rails

我在理解Ruby中的变量和符号的语法时遇到了一些麻烦.我正在阅读一本名为Agile Web Development with Rails 4的书.我正在尝试学习Ruby和Rails,以便我可以构建网站.

我阅读的书籍和教程有时会在它们前面加上带有"@"符号的变量,然后一些变量在它们前面没有@符号.他们之间有什么区别?

而且,我对结肠感到困惑.有时我看到冒号位于前面的变量,例如:order,然后我看到冒号末尾的变量,例如冒号:我不明白冒号在做什么.

请帮我理解Ruby语法.

m_x*_*m_x 9

@实例变量开头的变量是其他语言中的"属性"."经典"变量是其方法/块范围的本地变量,而实例变量是特定instance于对象的本地变量,例如:

class Foo

  def initialize(bar)
    @bar = bar
  end

  def bar
    @bar # the variable is specific to this instance
  end

  def buzz
    buzz = 'buzz' # this variable is not accessible outside of this method
  end

end
Run Code Online (Sandbox Code Playgroud)

您还可以看到以变量开头的变量@@,它们是类变量,并且可以由类的每个实例访问,并与子类的每个实例共享.通常不鼓励使用这些变量,主要是因为子类共享变量,这可能导致很多混乱.

在Ruby中,一切都是对象,类是对象(类的实例Class),因此您也可以拥有类实例变量:

class Foo

  def self.bar
    @bar #we are in class Foo's scope, which is an instance of class Class
  end

  def self.bar=(bar)
    @bar = bar
  end

  def bar
    @bar # Foo.new.bar != Foo.bar 
  end

end
Run Code Online (Sandbox Code Playgroud)

你所谓的"带冒号的变量" 不是变量.它们是一种特殊类型的字符串,称为符号,它是不可变的并且经过优化以便由解释器快速识别,实际上,它们作为指针存储在内部,因此这:this == :this是一种非常快速的操作.

此属性使它们成为哈希键的良好候选者,因为它们提供快速检索或"标志"传递给方法; 把它们想象成一种"代表"他们所说的松散常数.它们的不变性也很危险:所有创造的符号都不会被垃圾收集; 通过创建数千个符号来创建内存泄漏很容易,因此要明智地使用它们.

更新因为ruby 2.2符号在某些情况下可能被垃圾收集(当没有保留引用且不需要比较时)