【问题标题】:Symbols versus variables符号与变量
【发布时间】:2015-04-21 08:04:13
【问题描述】:

我正在尝试在 ruby​​ on rails 应用程序中迁移我的数据库,但我对下面显示的正确语法有点困惑:

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@categories?我想您必须命名正在创建的表,但为什么是符号?

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

【问题讨论】:

    标签: ruby-on-rails ruby symbols


    【解决方案1】:

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

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

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

    puts 'categories'.object_id
    puts 'categories'.object_id
    
    puts '---------------------'
    
    puts :categories.object_id
    puts :categories.object_id
    

    脚本的运行可能会产生类似这样的结果:

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

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

    【讨论】:

      【解决方案2】:

      (1) 您的标记化 :Migration 错误。应该理解为::Migration:: 是范围解析运算符。这意味着MigrationActiveRecord 的命名空间中被理解。你是对的,:: 被用作类方法调用。其实::有两个用途:作用域解析操作符,类方法调用;这是模棱两可的。这里是前者。

      (2, 3) @@categories@categories 或任何其他变量将被评估为它所持有的某个值。它并不意味着“类别”之类的东西。为了告诉“类别”之类的内容,可以将其表示为字符串中的"category",或符号中的:category

      【讨论】:

        猜你喜欢
        • 2018-03-14
        • 2017-06-07
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2010-10-11
        相关资源
        最近更新 更多