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的许多属性。