这是什么意思?这意味着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_accessorattr_reader等。您可能需要read up on Ruby symbols

+0

所以在我看来,一个符号看起来像Java或c#中的枚举值,对吧? – Mark 2010-05-10 17:33:58

+0

@Marco:不,Ruby中的符号与枚举值无关。它们更像是Lisp中的符号或者Smalltalk中的符号。 – 2010-05-10 17:40:42

+0

明白了,谢谢! – Mark 2010-05-10 17:50:17

这与Rails无关,它只是Ruby的Symbols:all是一个实际上只是一个基本字符串的符号。

: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提供了多种查看符号的方法。

要使用隐喻:符号用于多项选择测试,字符串用于短文问题。