加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby中的循环依赖

发布时间:2020-12-16 22:40:19 所属栏目:百科 来源:网络整理
导读:假设我们有两个类Foo和Foo Sub,分别在不同的文件foo.rb和foo_sub.rb中. foo.rb: require "foo_sub"class Foo def foo FooSub.SOME_CONSTANT endend foo_sub.rb: require "foo"class FooSub Foo SOME_CONSTANT = 1end 由于循环依赖,这不会工作 – 我们不能
假设我们有两个类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中的一个未初始化的常量.任何想法如何解决这个问题,而不把它们放在同一个文件中,也不会删除循环依赖?

解决方法

如果您需要从超类访问子类,那么您的模型很有可能被破坏(即它应该是一个类).

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

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

all_foos.rb:

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

并从foo.rb和foo_sub.rb中删除require.

2)从foo.rb中删除require

3)从foo_sub.rb中删除require,并在类定义后将foo.rb中的require放入.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读