all*_*lyh 11 ruby variables symbols accessor
编程和Ruby的新手,我希望关于符号的这个问题符合要求.据我所知,在红宝石的符号(如:book
,:price
)是特别有用的哈希键,以及全能做的是字符串可以做的事情一个轻量级的,特定子集.
但是,我在一方面对符号感到困惑.具体来说,当它们在attr_accessor
方法类型中使用时,它们看起来更像是一个变量.例如,attr_reader :book, :price
.
如果它们是该用法中的变量,那么这有点令人费解,因为它们通常不在变量类型中列出(如$ global,@ instance,local,@@ class,有时候,CONSTANT,变量类型)变量类型被描述.
如果符号是以这种方式使用的变量,那么应该对它们有什么范围?或者它们在这种情况下仍然是某种轻量级的字符串?(或者也许以更广泛的方式,符号,字符串和变量都具有基本的鸭子性质?)提前感谢您的见解和建议.
符号不是变量,而是一种文字值,如数字和带引号的字符串.值得注意的是,符号用于表示 Ruby运行时中的变量和其他命名值.因此,当Ruby解释器看到foo
用作变量或方法名称的名称时,它在运行时值的哈希值中查找的是符号:foo
,而不是字符串"foo"
.事实上,这是编程语言术语中"符号"一词的最初用法; 变量,函数,常量,方法等据说存储在编译器或解释器的"符号表"中.
几乎每当你在Ruby中传递某些东西的名字时,你就会使用一个符号.如果使用method_missing
catch-all在对象类上实现任意方法,则符号就是它作为参数接收的符号,告诉它实际调用的方法的名称.如果用.methods
or 检查一个对象.instance_variables
,你得到的是一个符号数组.等等.
访问器方法中使用的符号不是变量。它们只是代表变量的名称。变量持有一些引用,因此您不能在定义访问器方法时使用变量本身。例如,假设您想要@foo
在其值为 的上下文中为该变量定义一个访问器方法"bar"
。如果 Ruby 的语法如下所示,会发生什么:
attr_accessor @foo
Run Code Online (Sandbox Code Playgroud)
这与编写没有什么不同:
attr_accessor "bar"
Run Code Online (Sandbox Code Playgroud)
您无法访问@foo
您感兴趣的名称。因此,必须将此类结构设计为在元级别引用变量名称。出于这个原因,使用了符号。它们本身不是变量。它们代表变量的名称。
与访问器方法相关的变量是实例变量。
归档时间: |
|
查看次数: |
1072 次 |
最近记录: |