什么:这意味着Ruby on Rails?

我是Ruby和Ruby on Rails世界的新手。 我已经阅读了一些指南,但我在使用以下语法时遇到了一些麻烦。 我认为在Ruby中使用:condition语法来定义具有某种访问器的类属性,例如:

 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这里一直:all不变? 如果没有,这段代码的真正含义是什么? 如果是,为什么不使用以下内容:

 @posts = Post.find(ALL) 

谢谢

文本前面的冒号表示Ruby中的符号 。 符号有点像常量,但它几乎就像一个符号接收一个唯一的值(你不关心)作为它的常量值。

当用作哈希索引时,符号几乎(但不完全)与使用字符串相同。

此外,您可以通过在符号上调用to_s来读取所有内容:all 。 如果你有一个常量变量ALL ,除了查找它的值之外,没有办法确定它意味着“全部”。 这也是为什么你可以使用符号作为元方法的参数,如attr_accessorattr_reader等。

您可能想要阅读Ruby符号 。

:all都是象征。 符号是Ruby的实习字符串版本。 你可以这样想:有一个名为symbols的不可见全局表,它有String键和Fixnum值。 可以通过调用.to_sym将任何字符串转换为符号,该字符串在表中查找字符串。 如果字符串已经在表中,则返回Fixnum,否则,它将其输入表中并返回下一个Fixnum。 因此,符号在运行时被视为Fixnums:比较时间是恒定的(用C语言,符号的比较可以用==而不是strcmp

您可以通过查看对象的object_id来validation这一点; 当两个东西的object_ids相同时,它们都指向同一个对象。

您可以看到可以将两个字符串转换为符号,并且它们都具有相同的对象ID:

"all".to_sym.object_id == "all".to_sym.object_id #=> true

"all".to_sym.object_id == :all.object_id #=> true

但反过来却不是这样:(每次调用Symbol#to_s都会产生一个全新的字符串)

:all.to_s.object_id == :all.to_s.object_id #=> false

不要将符号看作是节省记忆的一种方式。 看看它们表明字符串应该是不可变的。 查看Ruby符号的13种方法提供了多种查看符号的方法。

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

这与Rails无关,它只是Ruby的符号 。 :all是一个有效只是一个基本字符串的符号。