什么:这意味着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_accessor
, attr_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
是一个有效只是一个基本字符串的符号。