gpt4 book ai didi

ruby-on-rails - 了解 `include` mixin 模块的 "subsequent"语句行为

转载 作者:数据小太阳 更新时间:2023-10-29 07:04:45 26 4
gpt4 key购买 nike

我试图理解 include 语句在多个 Mixin 中使用时的行为。也就是说,我有这些声明:

class Article < ActiveRecord::Base
include DoubleIncludedModule
include AModule

# ...
end

module AModule
include DoubleIncludedModule

# ...
end

module DoubleIncludedModule
# ...
end

DoubleIncludedModule 将被包含在 Article 类中多少次?也就是说,由于 DoubleIncludedModule 的“后续”包含(首先在 Article 类中,然后在 Article 包含的 AModule 类本身),将是 Ruby 自动处理的“双重包含”问题,还是 DoubleIncludedModule(错误地)包含两次?

当然,我想包含DoubleIncludedModule 模块仅一次。我怎样才能以正确的方式做到这一点(也许通过使用一些 Ruby on Rails 方法)?

最佳答案

我举个例子来回答:

module A
def self.included base
puts "A included in #{base}"
end
end

module B
include A

def self.included base
puts "B included in #{base}"
end
end

class C
include A
include B
end

p C.ancestors

打印

A included in B
A included in C
B included in C
[C, B, A, Object, Kernel, BasicObject]

正如我们所见,A 只包含一次到C 中。虽然技术上它被包含了两次,因为它被包含在 B 中,而 B 也被包含在 C 中。这有关系吗?可能不会。每个仍然只在祖先链中出现一次,并且任何方法都会被等效的实现覆盖——即,本质上是一个空操作。除非您使用 included 钩子(Hook)做一些奇特的事情,否则您不太可能注意到任何事情。

关于ruby-on-rails - 了解 `include` mixin 模块的 "subsequent"语句行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12594760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com