符号与变量

时间:2015-02-19 19:44:09

标签: ruby-on-rails ruby symbols

我试图在rails应用中的ruby中迁移我的数据库,我对下面显示的正确语法感到有点困惑:

class CreateCategories < ActiveRecord::Migration
    def change 
        create_table :categories do |t|
            t.string :name
            t.string :thumburl
            t.timestamps
        end
    end
end

(1)为什么在类命名区域使用符号:Migration?我读它的方式是创建一个类CreateCategories,它继承了ActiveRecord类的所有属性。我被告知双冒号表示类方法调用,但语法着色使我认为:Migration组件实际上是一个符号。这里发生了什么?

(2)我认为create_table是一种方法,但为什么要使用:categories,即符号,而不是类或实例变量,即@@categories或{{1} }?我想你必须说出正在创建的表格,但为什么是符号呢?

(3)为什么@categories:name符号而不是变量?

2 个答案:

答案 0 :(得分:2)

ActiveRecord::Migration不是符号,它是继承自的超类的名称。 ::是范围解析运算符,因此MigrationActiveRecord模块的成员。

至于为什么在各个地方使用符号,它们被用来代替你可能使用String的地方,例如给表格命名。您可以使用“类别”,但由于符号本质上只是指向对象的指针,因此在内存存储方面存在一定的额外效率,因为您没有在使用该符号的任何位置创建新字符串。

为了说明这个想法,请以下面的脚本为例:

puts 'categories'.object_id
puts 'categories'.object_id

puts '---------------------'

puts :categories.object_id
puts :categories.object_id

运行脚本可能会产生类似于此的内容:

19608760
19608660
---------------------
839388
839388

字符串版本有两个不同的ID,这意味着创建了两个单独的String对象。但是,符号版本打印相同的ID,这意味着只创建一个对象来表示符号,并且在使用符号的任何地方都使用相同的对象。

答案 1 :(得分:0)

(1)您的标记化:Migration是错误的。它应该被理解为::Migration::是范围解析运算符。这意味着在Migration的名称空间内理解ActiveRecord。你是对的::被用作类方法调用。实际上,::有两个用途:范围解析运算符和类方法调用;它含糊不清。在这里,它是前者。

(2,3)@@categories@categories或任何其他变量将被评估为它所拥有的特定值。这并不意味着&#34;类别&#34;。为了说出&#34;类别&#34;之类的内容,在字符串中将其表示为"category",或在符号中表示为:category,这是一种方法。