【问题标题】:some confusions about ruby class inheritance [closed]关于 ruby​​ 类继承的一些困惑 [关闭]
【发布时间】:2014-04-03 12:45:02
【问题描述】:

考虑以下代码块。

 module Bosh::Director::Models  
      class CompiledPackage < Sequel::Model(Bosh::Director::Config.db)
      ...
      end
 end

我对@9​​87654323@感到困惑,括号是什么意思? CompiledPackage 类如何继承 Sequel::Model(Bosh::Director::Config.db)

【问题讨论】:

  • 不清楚你的问题...
  • 您需要更好地了解 Ruby 的工作原理,并阅读 Sequel::Model 的文档; Sequel::Model(Bosh::Director::Config.db)sets the dataset the model uses.

标签: ruby class inheritance


【解决方案1】:

Sequel::Model 不是一个类——它是在模块Sequel 上定义的方法Model,它创建一个新的匿名类,根据传递的参数对其进行一些摆弄并返回这个类。它是这样定义的(来自github):

module Sequel
  ...
  def self.Model(source)
    if cache_anonymous_models && (klass = Sequel.synchronize{Model::ANONYMOUS_MODEL_CLASSES[source]})
      return klass
    end
    klass = if source.is_a?(Database)
      c = Class.new(Model)
      c.db = source
      c
    else
      Class.new(Model).set_dataset(source)
    end
    Sequel.synchronize{Model::ANONYMOUS_MODEL_CLASSES[source] = klass} if cache_anonymous_models
    klass
  end
  ...
end

当返回新的类对象时,继承照常进行。

【讨论】:

  • 呵呵!!方法命名为constant.. 完全误导... :-)
  • @ArupRakshit - 我同意,但是它们很常见,例如Array([1,2,3]) 是在 Kernel 模块中定义的方法(与 Float()、String() 等少数)
  • 我自己也同意你的说法。。我不知道这个patterns的意义。
  • @BroiSatse,我听不懂你的回答。我想知道Sequel::Model(Bosh::Director::Config.db)()是什么意思?
  • @user2886717:这就是将参数传递给 Ruby(以及几乎所有其他主流编程语言)中的方法的方式。
【解决方案2】:

Sequel::Model对应于 Ruby 中的表或数据集。 Bosh::Director::Config.db 可能会返回 mysql 之类的数据库类型?所以Sequel::Model(Bosh::Director::Config.db) 等于Sequel::Model(mysql),任何从它继承的类都表现得像一个mysql 表或数据集。就是这样。

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 2011-12-18
    • 2019-05-27
    • 2019-10-26
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多