当前位置:  开发笔记 > 后端 > 正文

Ruby中的循环依赖关系

如何解决《Ruby中的循环依赖关系》经验,为你挑选了1个好方法。

假设我们有两个类,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> Jules..:

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

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

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++,在你调用Foo#foo()之前,它不会抱怨FooSub.SOME_CONSTANT;)

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有