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