这听起来像是一个愚蠢的问题,但无论如何我都会试一试.
因此在Visual Studio中,您不能有两个项目X和Y,以便X引用Y和Y引用X.
总的来说,由于各种原因,我完全可以理解循环依赖是如何产生问题的.
但是,以这种方式编译两个相互依赖的项目真的不可能吗?在我看来,它必须是可能的,因为(在我的脑海-也许我完全关闭基地这个)有两个互相依赖的组件真的不是那么由具有两个相互依存类不同-它的情况是合法的,可以编译.
如果你说,"两个程序集不能相互依赖,因为编译器无法在另一个程序集之前编译",这对我来说是有意义的; 除了看起来你可以为同一个程序集中的两个类创建相同的参数,显然编译器可以很好地处理这个场景.
基本上我问的原因并不是我有一些绝望的愿望去做这件事,我知道这通常是不明智的.具体来说,我想知道,因为如果我可以有两个项目 - 比如MyProjectCS和MyProjectVB - 基本上作为单个单元的两个相互依赖的部分存在,并且只是分开因为某些部分是用C#编写的,这将是很好的.其他部分都是用VB.NET编写的.
所以,我的问题是(yikes,three-fold):
我有一个关于以下错误的问题" Unknown type name VistaDereIzq"
我有一个叫做的观点VistaDereIzq.我执行以下操作以在此视图中添加该视图.
#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import "VistaDereIzq.h"
#import "ViewController.h"
@interface VistaNavegador : UIViewController <UIWebViewDelegate>
{
VistaDereIzq *VistaIzq2; <----- "Unknown type name VistaDereIzq"
}
@end
Run Code Online (Sandbox Code Playgroud) 在一个项目中,我有两个类:
// mainw.h
#include "IFr.h"
...
class mainw
{
public:
static IFr ifr;
static CSize=100;
...
};
Run Code Online (Sandbox Code Playgroud)
// IFr.h
#include "mainw.h"
...
class IFr
{
public float[mainw::CSize];
};
Run Code Online (Sandbox Code Playgroud)
但我无法编译此代码,在该static IFr ifr;行收到错误.是否禁止这种交叉包含?
今天我遇到了一个奇怪的问题:模块上出现"遗漏方法"错误,但方法就在那里,并且需要定义模块的文件.经过一番搜索,我找到了一个循环依赖,其中2个文件需要彼此,现在我认为ruby默默地中止循环要求.
编辑开始:示例
文件'a.rb':
require './b.rb'
module A
def self.do_something
puts 'doing..'
end
end
Run Code Online (Sandbox Code Playgroud)
文件'b.rb':
require './a.rb'
module B
def self.calling
::A.do_something
end
end
B.calling
Run Code Online (Sandbox Code Playgroud)
执行b.rb给出b.rb:5:in 'calling': uninitialized constant A (NameError).对于两个文件都必须存在这些要求,因为它们要从命令行自行运行(我省略了该代码以保持简短).所以B.calling必须在那里.一种可能的解决方案是将需求包装起来if __FILE__ == $0,但这似乎不是正确的方法.
编辑结束
避免这些难以发现的错误(顺便说一下,如果要求抛出异常会不会更好?),是否有一些关于如何构建项目的指导方针/规则以及在哪里需要什么?例如,如果我有
module MainModule
module SubModule
module SubSubModule
end
end
end
Run Code Online (Sandbox Code Playgroud)
我应该在哪里需要子模块?所有在主要的,或只有主要的sub和sububub中的sub?
任何帮助都会很好.
在forforfs的回答和评论中讨论了为什么会发生这种情况的原因.
到目前为止,最佳实践(如lain指出或暗示)似乎如下(如果我错了,请纠正我):
MainModule将需要SubModule,Submodule并将需要SubSubModule)感谢所有回答/评论的人,这对我帮助很大!
假设class A有一个类型为的成员class B,并且class B有一个类型为的成员class A.
在Scala或Kotlin中,您可以按任何顺序定义类,而不必担心在这种情况下,因为第一个定义的类可以像往常一样使用第二个定义的类,即使在case/data类中也是如此.
但是在Python中,以下代码
class A:
b = B()
class B:
a = A()
Run Code Online (Sandbox Code Playgroud)
抛出编译错误,因为class B在定义时class A未定义.
你可以解决这个简单的案例,就像在这个答案中一样
class A:
pass
class B:
a = A()
A.b = B()
Run Code Online (Sandbox Code Playgroud)
但是,这种方式对Python中的数据类不起作用,因为在定义数据类之后分配成员不会更新数据类的自动生成方法,这使得"数据类"的使用变得无用.
@dataclass
class A:
b: B # or `b: Optional[B]`
@dataclass
class B:
a: A # or `a: Optional[A]`
Run Code Online (Sandbox Code Playgroud)
我该如何避免这个问题?
我们当前的项目遇到了循环依赖问题.我们的业务逻辑程序集使用SharedLibrary程序集中的类和静态方法.SharedLibrary包含一大堆辅助函数,例如SQL Reader类,枚举器,全局变量,错误处理,日志记录和验证.
SharedLibrary需要访问Business对象,但Business对象需要访问SharedLibrary.旧开发人员通过复制共享库中的业务对象的功能(非常反DRY)来解决这种明显的代码味道.我花了一天时间试图阅读我解决这个问题的选择,但我已经走到了尽头.
我对架构重新设计的想法持开放态度,但这只是最后的手段.那么如何才能拥有可以访问业务对象的共享助手库,业务对象仍然可以访问共享助手库?
我正在制作一个记录器服务,通过将错误(或调试,如果启用)保存到indexedDB数据库中来扩展angular的$ log服务.这是代码:
angular.module('appLogger', ['appDatabase'])
.service('LogServices', function($log, Database) {
// ...
this.log = function(type, message, details) {
var log = {};
log.type = type
log.context = this.context;
log.message = message;
log.dateTime = moment().format('YYYY-MM-DD HH:mm:ss');
log.details = details || '';
$log[type.toLowerCase()](log);
if (type === 'ERROR' || this.logDebug) {
Database.logSave(log);
}
};
// ...
})
Run Code Online (Sandbox Code Playgroud)
这是按照预期在我的服务中工作.现在的问题是我无法在数据库服务中使用我的记录器,因为它会抛出循环依赖性错误.我理解这个问题,但我不知道如何解决它...我应该如何解决这个问题?
谢谢你的帮助:-)
当一个部署项目包含第二个部署项目的项目输出,而第二个项目包含第一个项目的输出时,通常会发生此错误.
我有一个检查循环依赖的方法.在输入中,我们有一个包含,例如,一个词典<"A", < "B", "C" >>和 <"B", < "A", "D" >>,这意味着,A取决于B和C,我们有与循环依赖A->B.
但通常情况下我们会遇到更复杂的情况,并且存在一系列依赖关系.如何修改此方法以查找依赖链?例如,我想要一个包含chain的变量A->B->A,而不是类A与class有冲突B.
private void FindDependency(IDictionary<string, IEnumerable<string>> serviceDependence)
Run Code Online (Sandbox Code Playgroud) Python是非常优雅的语言.好吧,除了......除了进口.我仍然无法以对我来说似乎很自然的方式工作.
我有一个MyObjectA存档的类mypackage/myobjecta.py.该对象使用了一些实用程序函数mypackage/utils.py.所以在我myobjecta.py写的第一行:
from mypackage.utils import util_func1, util_func2
Run Code Online (Sandbox Code Playgroud)
但是一些实用程序函数创建并返回新的实例MyObjectA.所以我需要写utils.py:
from mypackage.myobjecta import MyObjectA
Run Code Online (Sandbox Code Playgroud)
好吧,不,我不能.这是一个循环导入,Python将拒绝这样做.
关于这个问题,这里有很多问题,但似乎都没有给出令人满意的答案.从我在所有答案中可以阅读的内容:
import ...而不是from ... import ...
(我个人不喜欢编写并可能重构所有全名限定符;我喜欢看看我从外部世界导入到模块中的确切内容).那会有帮助吗?我不确定,还有循环进口.我仍然希望有解决方案4)这将是Pythonic在功能和优雅,简单和工作的意义上.或者没有?
注意:我主要是一个C++程序员,上面的例子通过包含相应的标题很容易解决,我不相信它在Python中是不可能的.
在Xcode 10上,当我进行增量构建时,我正在使用我的一个框架获得此构建错误(clean build work):
Showing All Messages
:-1: Cycle inside LoggingSharedFramework; building could produce unreliable results.
Cycle details:
? Target 'LoggingSharedFramework' has a command with output 'blablabla/Build/Products/Debug-iphonesimulator/LoggingSharedFramework.framework/LoggingSharedFramework'
? Target 'LoggingSharedFramework' has link command with output 'blablabla/Build/Intermediates.noindex/blablablah/Debug-iphonesimulator/LoggingSharedFramework.build/Objects-normal/x86_64/LoggingSharedFramework'
Run Code Online (Sandbox Code Playgroud)
这个错误对我没有意义.实际原因是什么?我怎样才能弄清楚是什么引入了这个循环?我该如何修复周期?