这是什么意思?这意味着Ruby on Rails?
我是Ruby和Ruby on Rails领域的新手。我已经阅读了一些指南,但是我遇到了以下语法方面的问题。 我认为:condition
语法的使用Ruby中用于定义一个类属性与某种访问,如:这是什么意思?这意味着Ruby on Rails?
class Sample
attr_accessor :condition
end
隐含声明了“条件”属性的getter和setter。 虽然我正在看一些Rails示例代码,但我发现以下示例并不完全理解。
例如:
@post = Post.find(params[:id])
为什么它的访问id
属性与此语法,而不是:
@post = Post.find(params[id])
或者,例如:
@posts = Post.find(:all)
是:all
这里常数?如果不是,这个代码真的意味着什么?不使用如果是,为什么以下内容:
@posts = Post.find(ALL)
感谢
文本之前冒号表示在Ruby 符号。符号有点像常量,但它几乎就像一个符号接收一个独特的值(你不关心)作为它的常量值。
当用作散列索引时,符号几乎(但不完全)与使用字符串相同。
此外,您可以通过在符号上调用to_s
来从:all
中读取“全部”。如果你有一个恒定的变量ALL
,除了查看它的价值之外,没有办法确定它意味着“全部”。这也是为什么您可以使用符号作为元方法的参数,如attr_accessor
,attr_reader
等。您可能需要read up on Ruby symbols。
:all
是一个符号。符号是Ruby的版本interned strings。你可以这样想:有一个叫做symbols
的隐形全局表,它有String
个键和Fixnum
的值。通过调用.to_sym
可以将任何字符串转换为符号,该字符串将查找表中的字符串。如果该字符串已经在表格中,则返回Fixnum,否则它将它输入到表格中并返回下一个Fixnum。正因为如此,符号在运行时就像Fixnums处理:比较时间是恒定的
您可以验证这通过查看对象的object_id
(在C的说法,符号的比较可以与==
代替strcmp
完成) ;当两件东西的object_id相同时,它们都指向同一个对象。
你可以看到,你可以在两个字符串转换为符号,他们都会有相同的对象ID:
"all".to_sym.object_id == "all".to_sym.object_id #=> true
"all".to_sym.object_id == :all.object_id #=> true
但反之则不然:(每打电话符号#to_s将产生一个全新的字符串)
:all.to_s.object_id == :all.to_s.object_id #=> false
不要将符号看作是一种节省内存的方式。将它们看作是指示该字符串应该是不可变的。 13 Ways of Looking at a Ruby Symbol提供了多种查看符号的方法。
要使用隐喻:符号用于多项选择测试,字符串用于短文问题。
所以在我看来,一个符号看起来像Java或c#中的枚举值,对吧? – Mark 2010-05-10 17:33:58
@Marco:不,Ruby中的符号与枚举值无关。它们更像是Lisp中的符号或者Smalltalk中的符号。 – 2010-05-10 17:40:42
明白了,谢谢! – Mark 2010-05-10 17:50:17