【问题标题】:Square brackets in ActiveRecord::Migration class name? [duplicate]ActiveRecord::Migration 类名中的方括号? [复制]
【发布时间】:2018-06-14 03:50:18
【问题描述】:

在 Ruby on Rails 5.2 中,迁移文件包含一个如下所示的类。

class MyMigration < ActiveRecord::Migration[5.2]

我知道[5.2] 语法指定了迁移目标的rails 版本,但我不明白它是如何工作的。 Migration[5.2] 不是有效的 Ruby 类名。

这个方括号语法是什么,它是如何不引起 ruby​​ 语法错误的?

【问题讨论】:

  • 它不是一个有效的类名,但它是一个类的有效方法——另见Hash[]

标签: ruby-on-rails ruby


【解决方案1】:

Ruby 对象可以有[] 方法。它们在Array 类中使用,但任何类都可以实现它们。

def []()
  ...
end

由于类是完整的对象,它们也可以有方括号方法。

【讨论】:

  • 我明白了。那么该方法将返回一个允许 MyMigration 对其进行子类化的 Class 对象?
  • @fourseventy 它可以返回它想要的任何东西,但如果它不返回 Migration 实现,那将是违反直觉的。
  • @DaveNewton:如果它不返回Class 的实例,它将是TypeError
  • @fourseventy:我认为您缺少的部分是您(错误地)假设&lt; 右侧的代码必须是“类名”。实际上,Ruby 中的类没有 名称(至少不是Java 意义上的)。类只是一个对象,就像任何其他对象一样。因此,&lt; 右侧的代码只是可执行的 Ruby 代码,其计算结果为 Class 类的实例。你可以在那里放[Array, Hash].sample 这样的东西,你的类会随机继承ArrayHash
  • @JörgWMittag 这就是我所有代码的作用。让事情变得更有趣。
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
相关资源
最近更新 更多