#3 楼 @shangrenzhidao 不对,你要这么理解:
"some_string".object_id == "some_string".object_id #=> false
:some_string.object_id == :some_string.object_id #=> true
这个例子说明了 Symbol 和 String 的一个非常重要的不同,并且可以解释为什么偏好以 Symbol 做 Hash 中的 Key。
Java 的 String 是 immutable 的;Ruby 的 String 是 mutable 的,Symbol 是 immutable 的。用指针理解还是有偏差,也没有规定 Hash 里只有 Symbol 可以指向值,事实其他对象也可以。这个不用纠结,Symbol 就是 Symbol,表示了一个不变的符号,冒号的字面量写法只是语法而已。
#17 楼 @kenshin54 我不明白①为什么这个 label <%= f.label :name, "Name" %> 也要加上:name,它的作用不是在页面上显示 Name 吗? ②这些 Symbol 是不是作为对象的属性的 key 呢?谢谢你。
<%= f.label :name, "Name" %>
这里没有规定一定要传 Symbol,传 String 也是可以的,它会帮你生成 <label for="model_name">Name</label>
,这个值是不是 :name 不重要,可以是任何值,对应生成的内容就会变,不过通常都是写和对象的属性对应的 key,这样生成的 label 的 for 属性和 对应 input 的 id 是一致的,这样对于单选钮、复选框可以通过选择 label 的文字就能选中单选钮、复选框。
饿 说了一大堆废话。。。
一般我们用字符串就两个用处:
我是这么理解的: name 与 :name 就如 java 中的 String name 与 static String name 区别在于内存中的存储单元是否重新分配,如果 name 的话,用完了就重新分配,:name 的话,不管在哪里使用,始终是一个存储单元,不会重新创建一个新的存储单元来存放数据
#29 楼 @shangrenzhidao 我没有实验过,但想想就是,没次重新得创建一个对象,给其分配存储单元,肯定会比直接用以前的存储单元存储数据要耗时