gpt4 book ai didi

ruby - Ruby 中的循环依赖

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:15 24 4
gpt4 key购买 nike

假设我们有两个类,Foo 和 Foo Sub,分别在不同的文件 foo.rb 和 foo_sub.rb 中。

foo.rb:

require "foo_sub"
class Foo
def foo
FooSub.SOME_CONSTANT
end
end

foo_sub.rb:

require "foo"
class FooSub < Foo
SOME_CONSTANT = 1
end

由于循环依赖,这是行不通的——我们不能在没有其他类的情况下定义任何一个类。我见过各种解决方案。我想避免其中两个 - 即,将它们放在同一个文件中并删除循环依赖性。因此,我找到的唯一其他解决方案是前向声明:

foo.rb:

class Foo
end
require "foo_sub"
class Foo
def foo
FooSub.SOME_CONSTANT
end
end

foo_sub.rb

require "foo"
class FooSub < Foo
SOME_CONSTANT = 1
end

不幸的是,如果我有三个文件,我就无法使用同样的东西:

foo.rb:

class Foo
end
require "foo_sub_sub"
class Foo
def foo
FooSubSub.SOME_CONSTANT
end
end

foo_sub.rb:

require "foo"
class FooSub < Foo
end

foo_sub_sub.rb:

require "foo_sub"
class FooSubSub < FooSub
SOME_CONSTANT = 1
end

如果我需要 foo_sub.rb,那么 FooSub 是 foo_sub_sub.rb 中一个未初始化的常量。有什么想法可以在不将它们放在同一个文件中或删除循环依赖的情况下解决这个问题吗?

最佳答案

如果您需要从父类(super class)访问子类,那么您的模型很可能已损坏(即它应该是一个类)。

也就是说,有几个明显的解决方案:

1) 只需创建一个需要 foo 文件的文件:

all_foos.rb:

require "foo.rb"
require "foo_sub.rb"

并从 foo.rb 和 foo_sub.rb 中删除要求。

2) 从 foo.rb 中移除 require

3) 从foo_sub.rb 中移除require 并将require 放入foo.rb 类定义之后。

Ruby 不是 C++,它不会提示 FooSub.SOME_CONSTANT 直到你调用 Foo#foo() ;)

关于ruby - Ruby 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/396168/

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