【问题标题】:What does :this means in Ruby on Rails?:this 在 Ruby on Rails 中意味着什么?
【发布时间】:2011-02-17 18:54:38
【问题描述】:

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

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 symbols


    【解决方案1】:

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

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

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

    您可能想read up on Ruby symbols

    【讨论】:

    • 所以在我看来,符号就像 Java 或 c# 中的 Enum 值,对吧?
    • @Marco:不,Ruby 中的符号与枚举值完全不同。它们更像是 Lisp 中的符号或 Smalltalk 中的符号。
    • 它们有点像枚举,因为它们在源代码中按名称给出,并在运行时计算为常量,但它们不一样......例如枚举在编译时插入,符号在运行时插入。
    • 一篇描述符号以节省内存的文章非常落后。节省内存应该是正确做事的副作用,而不是使用它们的目的!
    • 嗨,谢谢马克 - 您发布的链接已失效。有什么想法吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您可以通过查看对象的object_id 来验证这一点;当两个事物的 object_id 相同时,它们都指向同一个对象。

      您可以看到您可以将两个字符串转换为符号,并且它们都将具有相同的对象 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

      【讨论】:

        【解决方案4】:

        不要将符号视为节省内存的一种方式。将它们视为表明字符串应该是不可变的。 13 Ways of Looking at a Ruby Symbol 提供了多种看待符号的方式。

        打个比方:符号用于选择题,字符串用于作文题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          • 2021-07-23
          相关资源
          最近更新 更多