【问题标题】:Ruby: grammar name for [number] after subclass of one class [duplicate]Ruby:一个类的子类后[number]的语法名称[重复]
【发布时间】:2016-07-25 04:47:27
【问题描述】:

我正在通过示例学习 Ruby on Rails。我在迁移文件夹中看到了一个示例代码:

class RemoveOrderListNumberAndStateFromOrderLists < ActiveRecord::Migration[5.0]
  def up
    remove_column :order_lists, :order_list_number
    remove_column :order_lists, :state
  end

  def down
    add_column :order_lists, :order_list_number, :string
    add_column :order_lists, :state, :integer
  end
end

我不知道的是在这一行:

class RemoveOrderListNumberAndStateFromOrderLists < ActiveRecord::Migration[5.0]

我知道这个命令的意思是:创建一个类,它是ActiveRecord::Migration 的子类,并且 5.0 是项目的 rails 版本。我不知道的是:在上述情况下,哪个 ruby​​ 语法名称允许您在课后声明 [number]。我认为唯一的方法是数组,但在这种情况下不太可能。

谢谢

【问题讨论】:

  • 如果您对其中一个答案感到满意,请点击左侧的复选标记接受其中一个。
  • @Jörg W Mittag 您将我的帖子标记为与旧帖子重复:D 请仔细考虑。

标签: ruby-on-rails ruby


【解决方案1】:

Ruby 语言带有许多所谓的“语法糖”,它允许您以不同的方式表达相同的想法。糖的目的是让程序员找到一种方法来表达对个人最有意义的想法。

在您的情况下,方括号只是调用带参数的方法的另一种方式——没有功能上的区别。 proc[]proc.call() 的另一种说法,所以括号只是隐藏了call。通常,您只会看到这些括号与 lambda 一起使用。这种类型的符号没有特定的“语法名称”——它只是符号。

具体来说,这是在ActiveRecord::Migration 上调用的类方法,它告诉类正在使用哪个迁移版本。注意:如果你有 Rails 的发布版本,你不应该需要那个符号——它应该在 beta 完成后被删除。

您可以在GitHub repository 中查看ActiveRecord::Migration 在何处以及如何使用该类方法

    def self.[](version)
      version = version.to_s
      name = "V#{version.tr('.', '_')}"
      unless Compatibility.const_defined?(name)
        versions = Compatibility.constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete('V').tr('_', '.').inspect }
        raise "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}"
      end
      Compatibility.const_get(name)
    end

【讨论】:

    【解决方案2】:

    如果您检查source code,您会看到它用于查找ActiveRecord::Migration 的兼容性版本,在您的情况下,这将返回类ActiveRecord::Migration::Current,因此您的迁移将是那个班级。

    目前,我认为只有 2 个版本可用:v4.2 和 v5.0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多