Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 理解Ruby变量和符号?_Ruby On Rails_Ruby_Syntax - Fatal编程技术网

Ruby on rails 理解Ruby变量和符号?

Ruby on rails 理解Ruby变量和符号?,ruby-on-rails,ruby,syntax,Ruby On Rails,Ruby,Syntax,我在理解Ruby中变量和符号的语法时遇到了一些困难。我正在读一本名为《Rails 4的敏捷Web开发》的书。我正在尝试学习Ruby和Rails,这样我就可以建立网站了 我读过的书和教程有时前面有带“@”符号的变量,而有些变量前面没有@符号。他们之间有什么区别 还有,我对冒号感到困惑。有时我看到冒号在前面的变量,如:order,然后我看到冒号在末尾的变量,如冒号:。我不明白冒号在做什么 请帮助我理解Ruby语法 有时变量前面有“@”符号,而有些变量前面没有@符号 带有“@”符号的变量是实例变量,前

我在理解Ruby中变量和符号的语法时遇到了一些困难。我正在读一本名为《Rails 4的敏捷Web开发》的书。我正在尝试学习Ruby和Rails,这样我就可以建立网站了

我读过的书和教程有时前面有带“@”符号的变量,而有些变量前面没有@符号。他们之间有什么区别

还有,我对冒号感到困惑。有时我看到冒号在前面的变量,如:order,然后我看到冒号在末尾的变量,如冒号:。我不明白冒号在做什么

请帮助我理解Ruby语法

有时变量前面有“@”符号,而有些变量前面没有@符号

带有
“@”
符号的变量是实例变量,前面没有
@
,可以是常量、局部变量或全局变量。阅读

有时我会看到冒号在前面的变量,比如:order

他们被称为

然后我看到冒号在末尾的变量,比如冒号:。我不明白冒号在做什么

这些可能是散列语法(正如您给我们的提示,所以我猜),其中键是符号。示例:
{foo:1}
-这是一个

还应您的要求阅读:


实例变量:
@foo='123'
)定义了一个实例变量,并在请求的整个当前实例中保留其值。在rails mvc范例中,实例变量的最常用用法是帮助将数据从控制器传递到视图,并允许您在控制器的一个部分中定义内容,在另一个部分中使用

class ProjectsController < ApplicationController
  before_filter :find_project

  def show; end

  def update
    if @project.update_attributes(params[:project])
      ...
    end
  end

  private
  def find_project
    @project = Project.find(params[:id])
  end
end
class ProjectsController
在上面的代码中,您可以看到在每个方法之前运行一个before过滤器。在上面的例子中,我们找到当前项目并将其保存到实例变量中。由于它是一个实例方法,因此可以访问该类中的任何位置以及用于呈现html的视图


局部变量:
foo='123'
)顾名思义,它们只能在定义它们的当前方法(
def
)中访问。

@
开头的变量是实例变量,在其他语言中是“属性”。“经典”变量是其方法/块范围的局部变量,而实例变量是对象的特定
实例的局部变量,例如:

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
您还可以看到以
@
开头的变量,这些变量是类变量,可由类的每个实例访问,并与子类的每个实例共享。通常不鼓励使用这些变量,主要是因为子类共享变量,这可能会造成很多混乱

在Ruby中,一切都是对象,类都是对象(class
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
你所谓的“带冒号的变量”是而不是变量。它们是一种特殊类型的字符串,称为符号,它是不可变的,并经过优化以便于解释器快速识别,事实上,它们作为指针存储在内部,因此
:this==:this
是一种非常快速的操作

这个属性使它们成为散列键的好候选,因为它们提供了快速检索或“标志”传递给方法;把它们看作是一种松散的常数,代表着他们所说的。它们的不变性也很危险:所有曾经创建的符号都不会被垃圾收集;创建数千个符号很容易造成内存泄漏,所以要明智地使用它们


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

带有
@
符号的变量是实例变量。这意味着只要声明它们的类的实例持续存在,它们就会持续存在。因此,如果您有一个名为
Message
的类,并且每条消息都有一个名为
@subject
的变量,那么当您实例化一条新消息时,只要消息对象本身存在,它就会将该subject变量保留在内存中。现在,如果它没有
@
符号,那么一旦它在“超出范围”aka中声明的函数完成,变量就会“丢失”,因为函数已经完成,并且Ruby VM回收了内存。还有以两个
@
符号开头的“类变量”。这意味着该变量在类的所有实例中共享


至于冒号,如果它位于一个变量之前,则表示它是一个“符号”,在Ruby中,它通常用作哈希和其他数据位的标识符。在Ruby 1.9+语法中,如果它位于单词的末尾,则表示它是哈希标识符的关键部分。

实例变量、局部变量和全局变量之间有什么区别?实例变量用于什么?@SameerAnand您应该花一些时间阅读面向对象理论和变量范围。这些不是特定于ruby的概念,我知道所有关于面向对象编程的知识,我一直使用Java。然而,我很难转向RubyonRails,因为语法完全不同,Rails对我来说是全新的东西,而Web开发是我在Java中从未做过的事情。@SameerAnand那么你知道instanc是什么吗