Ruby on rails Ruby中的符号和变量有什么区别?

Ruby on rails Ruby中的符号和变量有什么区别?,ruby-on-rails,ruby,variables,symbols,Ruby On Rails,Ruby,Variables,Symbols,我试图理解ruby中符号和变量之间的区别。他们在给出引用对象的名称时似乎做了完全相同的事情 我已经读过很多关于更快程序的符号,但我不确定它们为什么或者如何与变量有任何不同。它们非常不同。变量为对象提供标签。符号更像字符串,不同的是它们是不可变的,并且被存储在内存中,因此对同一符号的多个引用不会使用额外的内存。(与字符串相比,对同一字符串的多个引用将导致该字符串的多个副本。)符号是一个“内部化”字符串,它更像一个常量。典型示例: account_details = { :name =>

我试图理解ruby中符号和变量之间的区别。他们在给出引用对象的名称时似乎做了完全相同的事情


我已经读过很多关于更快程序的符号,但我不确定它们为什么或者如何与变量有任何不同。

它们非常不同。变量为对象提供标签。符号更像字符串,不同的是它们是不可变的,并且被存储在内存中,因此对同一符号的多个引用不会使用额外的内存。(与字符串相比,对同一字符串的多个引用将导致该字符串的多个副本。)

符号是一个“内部化”字符串,它更像一个常量。典型示例:

account_details = {
  :name => 'Bob',
  :age => 20
}
这里的符号
:name
:age
是散列的键。它们不能与变量混淆<代码>帐户详细信息是一个变量

Ruby中的变量是某种对象的句柄,该对象可能是一个符号

通常,使用字符串时使用符号会导致大量重复。请记住,字符串通常是不同的对象,不同的符号总是指向同一个对象,如果经常使用,会使它们更有效

比较:

"string".object_id == "string".object_id
# => false

:string.object_id == :string.object_id
# => true

尽管这两个字符串相同,但它们是独立的字符串对象。当用作散列、方法参数和其他常见情况的键时,这些对象将很快因大量重复而使内存混乱,除非您特意使用同一个字符串实例。符号会自动执行此操作。

变量包含对对象的引用。例如,变量可以引用字符串和符号,如:

a = 'foo'
b = :bar
在Ruby中,字符串是可变的,这意味着您可以更改它们:
“foo”+“bar”
将给出一个串联字符串。您可以将符号视为不可变字符串,这意味着您无法更改符号:
:foo+:bar
将给您一个错误。最重要的是,相同的符号表示相同的对象:

a = :foo
b = :foo
a.object_id # => 538728
b.object_id # => 538728

这提高了散列查找和其他操作的性能。

感谢您的回复,我认为我的困惑来自于使用带有属性的符号。为实例变量编写属性读取器时,在属性中使用符号,但返回变量。在这种情况下,符号与实例变量的关系如何?
attr\u accessor:example
表示“定义名为'example'的读/写属性”,并定义方法
example
和example=`以及实例变量
@example
。参数作为符号传入,因此接收方法可以知道它是什么。记住,变量名是局部的,变量名永远不会传入
attr_reader example
的意思是“使用变量example希望调用的任何东西创建一个reader”。
attr\u reader
函数无法知道变量的名称。这里的关系是,符号用于传递所需的名称。另请参见“”。通过变量引用字符串会不会做同样的事情,并在内存中保留一个实例?就像在JS中使用变量来防止重复,只获取相同的数据一次一样。@Cameron:嗯,在类似
a=“string”,b=a
的情况下,是的。在
a=“string”的情况下;b=“string”
,将创建两个内容为“string”的对象。(我不确定JS是如何处理的。)我想向未来的读者指出,能够添加两个对象来获取另一个对象并不意味着该对象是可变的。Python和Lua中的字符串是不可变的;添加其中的两个对象将生成另一个对象。在Ruby中,字符串是可变的,但是添加两个字符串都不会改变任何一个基本字符串,它会为您提供一个新的string对象。