Ruby和:符号

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

任何人都可以帮我解决这个问题吗?

用“所谓的东西”来思考符号是有用的。 换句话说,香蕉是指“香蕉之类的东西”。 它们在Ruby中被广泛使用,主要用作Hash(关联数组)键。

它们真的类似于字符串,但在幕后却非常不同。 一个关键的区别是内存中只存在一个特定符号。 因此,如果您在代码中引用:banana 10次,则只创建一个:banana的实例,它们都引用该实例。 这也意味着它们是不可改变的。

在共享相同内存空间的意义上,符号类似于字符串文字,但重要的是要注意它们不是字符串等价物。

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

来自Symbol doc:

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

因此,您基本上将它用于将字符串视为常量的位置。

例如,将它与attr_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" 

将符号视为:

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

例如:

 s = "FooBar" length = s.send(:length) >>> 6 

@AboutRuby有一个很好的答案,使用术语“所谓的东西”。

:香蕉指的是“香蕉之类的东西”。

他指出,您可以在代码中多次引用香蕉及其相同的对象 – 即使在不同的范围内或在某些奇怪的库中关闭。 :香蕉是一种叫做香蕉的东西,无论你使用它时可能意味着什么。

它们被用作

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