Ruby 红宝石与符号

Ruby 红宝石与符号,ruby,symbols,Ruby,Symbols,我刚刚开始使用Ruby,正在阅读“编程Ruby 1.9-实用程序员指南”。我遇到了一种叫做符号的东西,但作为一名PHP开发人员,我不明白它们是做什么的,它们有什么好处 有人能帮我解决这个问题吗?请将符号视为: 计划稍后使用的方法名称 要存储和比较的常量/枚举 例如: s = "FooBar" length = s.send(:length) >>> 6 符号在共享相同内存空间的意义上类似于字符串文字,但重要的是要注意它们不是字符串等价物 在Ruby中,当您键入“this”

我刚刚开始使用Ruby,正在阅读“编程Ruby 1.9-实用程序员指南”。我遇到了一种叫做符号的东西,但作为一名PHP开发人员,我不明白它们是做什么的,它们有什么好处


有人能帮我解决这个问题吗?

请将符号视为:

  • 计划稍后使用的方法名称
  • 要存储和比较的常量/枚举
例如:

s = "FooBar"
length = s.send(:length)
>>> 6
符号在共享相同内存空间的意义上类似于字符串文字,但重要的是要注意它们不是字符串等价物

在Ruby中,当您键入
“this”
“this”
时,您使用的是两个不同的内存位置;通过使用符号,您将在程序执行期间仅使用一个名称。因此,如果您在程序中的多个位置键入
:此
,您将只使用一个

从文件:

符号对象表示Ruby解释器中的名称和一些字符串。它们是使用
:name
:“string”
文本语法以及各种
to_sym
方法生成的。在程序执行期间,将为给定名称或字符串创建相同的符号对象,而不管该名称的上下文或含义如何。因此,如果
Fred
在一个上下文中是常量,在另一个上下文中是方法,在第三个上下文中是类,那么符号
:Fred
在所有三个上下文中都是相同的对象

所以,基本上,当你想把一个字符串当作一个常量时,你就可以使用它

例如,通常将其与
attr\u accessor
方法一起使用,以定义属性的getter/setter

class Person 
   attr_accessor :name 
end
p = Person.new
p.name= "Oscar"
但这也会起到同样的作用:

class DontDoThis
   attr_accessor( "name" )
end
ddt = DontDoThis.new
ddt.name= "Dont do it"

从“被调用的东西”的角度来考虑符号是很有用的。换句话说,香蕉指的是“被调用的东西”。它们在Ruby中被广泛使用,主要用作哈希(关联数组)键


它们真的很像弦乐,但在幕后却大不相同。一个关键区别是,内存中只存在一个特定符号。因此,如果您在代码中引用:banana 10次,那么只会创建:banana的一个实例,并且它们都引用了该实例。这也意味着它们是不可变的。

@AboutRuby有一个很好的答案,使用了“被称为”的术语

当前位置香蕉指的是“东西” 叫香蕉。”

他指出,您可以在代码中多次引用:banana,它是同一个对象——即使在不同的范围内,或者在某个奇怪的库中香蕉是一种叫做香蕉的东西,不管你用它的时候是什么意思

它们被用作

  • 数组的键,以便查找:您只有一个条目。在大多数语言中,如果这些字符串是字符串,那么内存中可能有多个带有文本“banana”的字符串,并且代码无法检测到它们是相同的
  • 方法/进程名称。大多数人都熟悉C如何用括号区分方法和调用:my_方法和my_方法()。在Ruby中,由于括号是可选的,所以这两个括号都表示对该方法的调用。但是,符号可以方便地用作方法的替代品(即使符号和方法之间确实没有关系)
  • 枚举(和其他常量)。因为它们不会改变,所以它们展示了其他语言中这些特性的许多特性

除了人们给出的答案外,这里还有一些链接,指向一些有助于解释符号的好博客帖子:这基本上是@OscarRyz的复制品。这是真的,符号和字符串之间的区别多年来被高度淡化了——我只想说得更“哲学化”象征主义的含义不象“哲学的”,而是“传统的”。是的,约定是它们通常在需要引用方法名的任何地方,并且作为散列的键。sym=:某物;sym.size给出了一个错误。最好把一个符号看作一个唯一的id(一个整数),它可以被一个字符串常量引用。@碱性:是的,这就是为什么我强调相似而不是等价或其他单词的原因。按照您的示例,它们也不应被视为整数
:hola+:adios
也会给出一个错误;)。我想需要一个不同的词。完全正确:-)你不能做符号算术,尽管你可以把一个符号转换成整数符号。但是,您也可以将符号转换为字符串(symbol.to_)。符号是真正唯一的对象,其作用类似于哈希键、参数名等的唯一ID。