Ruby 红宝石与符号
我刚刚开始使用Ruby,正在阅读“编程Ruby 1.9-实用程序员指南”。我遇到了一种叫做符号的东西,但作为一名PHP开发人员,我不明白它们是做什么的,它们有什么好处Ruby 红宝石与符号,ruby,symbols,Ruby,Symbols,我刚刚开始使用Ruby,正在阅读“编程Ruby 1.9-实用程序员指南”。我遇到了一种叫做符号的东西,但作为一名PHP开发人员,我不明白它们是做什么的,它们有什么好处 有人能帮我解决这个问题吗?请将符号视为: 计划稍后使用的方法名称 要存储和比较的常量/枚举 例如: s = "FooBar" length = s.send(:length) >>> 6 符号在共享相同内存空间的意义上类似于字符串文字,但重要的是要注意它们不是字符串等价物 在Ruby中,当您键入“this”
有人能帮我解决这个问题吗?请将符号视为:
- 计划稍后使用的方法名称
- 要存储和比较的常量/枚举
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中,由于括号是可选的,所以这两个括号都表示对该方法的调用。但是,符号可以方便地用作方法的替代品(即使符号和方法之间确实没有关系)
- 枚举(和其他常量)。因为它们不会改变,所以它们展示了其他语言中这些特性的许多特性
:hola+:adios
也会给出一个错误;)。我想需要一个不同的词。完全正确:-)你不能做符号算术,尽管你可以把一个符号转换成整数符号。但是,您也可以将符号转换为字符串(symbol.to_)。符号是真正唯一的对象,其作用类似于哈希键、参数名等的唯一ID。