2014-10-30 56 views
0

学习导轨时,在某些情况下冒号放置在单词前或其他场合放在单词后面时,我经常感到困惑。我一直在阅读和重读,试图更好地理解这一点,并且到目前为止已经确定,当冒号放在单词之前时,它就是一个符号。使用符号作为散列键

我以为我明白了这一点,直到我读到“Agile Web Development with Rails 4 (Facets of Ruby), page 56”。

我正确理解一个符号在其名称前面有一个冒号,即使用作散列中的键也是有另一种语法将冒号后面的符号名置于散列中?

+0

注意,即使您使用符号作为散列键,JavaScript尾部冒号样式也不会始终有效。例如'{:$ set => {...}}'是有效的,但是{$ set:{...}}是语法错误。 – 2014-10-30 22:42:33

+1

您可能会对[**是Hash Rocket弃用?**](http://stackoverflow.com/q/10004158/479863),[**如何从关联创建符号(哈希键),使用新的红宝石(1.9)哈希语法?**](http://stackoverflow.com/q/8796358/479863)和[**在Ruby 1.8 **中支持Ruby 1.9的哈希语法](http://stackoverflow.com/q/9694209/479863)。关于这些问题,请查看侧栏中的*相关*部分,以便更深入地讨论这种令人困惑的Ruby特性。 – 2014-10-30 22:46:42

回答

1

这是正确的。符号总是名称

:foo 

原始符号与符号键的哈希是

{ :foo => "bar" } 

然而,由于红宝石1.9时,存在被设计为替代符号之前与结肠定义更紧凑。

{ foo: "bar" } 

这两个符号是等价的。但是,这是一个特定的哈希异常。下面是不是在它的有效符号宣言

foo: 
+1

感谢您的回复。我不明白的是,如果原始符号是: {:foo =>“bar”} 并且有想缩短它为什么不使它: {:foo“bar”} 因此,本质上当我在一个单词之前看到一个冒号我知道它是一个符号,当我在一个单词后面看到一个冒号时,我知道它仍然是一个符号,但只是在使用紧凑格式的散列中使用。即 Model.where(:foo =>'bar')。update_all(作者:'David') – Dercni 2014-10-30 22:37:53

+0

这两个符号是不等价的,因为JavaScript风格允许的符号比hashrocket允许的符号更有限。 – 2014-10-30 22:44:10

+0

以为我有这个,直到我在示例迁移中阅读以下内容: t.decimal:price,precision:8,scale:2 因此,价格,精度和比例都是符号,但后两者使用紧凑符号在一个哈希? – Dercni 2014-10-30 23:01:16

1

是的,如果你启动Rails的控制台,然后运行:

{ test: "ds"}.keys[0] == :test 

你会看到它返回true