Rails 这些冒号让我很困惑

shangrenzhidao · 2013年11月14日 · 最后由 shangrenzhidao 回复于 2013年11月18日 · 7189 次阅读

<%= form_for @event, :url => { :controller => "events", :action => "update", :id => @event } do |f| %> <%= f.label :name, "Name" %>

<%= f.text_field :name %>

<%= f.label :description, "Description" %>

<%= f.text_area :description %>

<%= f.submit "Update" %> <% end %>

如上表的表单,冒号代表变量的属性吗?

是 ruby 中的 symbol

Symbol 是 Ruby 中的一种数据类型,具体见 http://ruby-doc.org/core-2.0.0/Symbol.html

#1 楼 @ftiasch #2 楼 @lgn21st 这么理解对不对 String s = "ddd" , s = "ccc" ... s 就是 symbol

#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。

#4 楼 @lgn21st 谢谢,我还是习惯拿 java 作对比,是不是前者完全是两个不同的对象,后者是相同的对象

可以理解为指针

#6 楼 @davidminaki 这更难理解了。

#7 楼 @Rei 我现在已经走火入魔了!

我也这么理解,符号就是指针。

#9 楼 @zealinux 那么也就是对象内容发生了改变,这个符号也不会变,类似于 java 的引用?是不是这样的?

:name 的值就是 :name,我一开始都没想那么多。

以指针的方式去理解符号很轻松啊

#15 楼 @davidminaki 好的 我再去理解一下

Java 的 String 是 immutable 的;Ruby 的 String 是 mutable 的,Symbol 是 immutable 的。用指针理解还是有偏差,也没有规定 Hash 里只有 Symbol 可以指向值,事实其他对象也可以。这个不用纠结,Symbol 就是 Symbol,表示了一个不变的符号,冒号的字面量写法只是语法而已。

#17 楼 @kenshin54 我把它理解成特殊不便的字符串。

#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 的文字就能选中单选钮、复选框。

饿 说了一大堆废话。。。

对 Ruby 的 Symbol,我也很不理解。学习 ing

Symbol 就是轻量级的字符串

#23 楼 @kikyous 嗯,多多少少也理解一些,这么说有道理

一般我们用字符串就两个用处:

  1. 表示字符数据,比如地址、名字
  2. 仅仅用作名字,比如某种状态,如"active"或者"cancelled" ruby 里面的 symbol 就是用在第二种场景的。

@zillou 我觉得 #26 楼 的这个解释是最容易被理解的

我是这么理解的: name 与 :name 就如 java 中的 String name 与 static String name 区别在于内存中的存储单元是否重新分配,如果 name 的话,用完了就重新分配,:name 的话,不管在哪里使用,始终是一个存储单元,不会重新创建一个新的存储单元来存放数据

#28 楼 @tank_lei 重新分配就会带来效率的问题对吗?

#29 楼 @shangrenzhidao 我没有实验过,但想想就是,没次重新得创建一个对象,给其分配存储单元,肯定会比直接用以前的存储单元存储数据要耗时

我认为 符号就是一种特殊的字符串, 常用于描述系统资源,比如 变量名,类名,函数名,等等。

#31 楼 @ery 只有其指待的东西一确定,那么就不可能再改变,对吗

#32 楼 @shangrenzhidao 抱歉,我没理解你的意思。 你还是把它当成字符串理解吧,不要当指针去理解。

#33 楼 @ery 呵呵,轻量级字符串

需要 登录 后方可回复, 如果你还没有账号请 注册新账号