有没有办法在不使用指针的情况下定义循环引用?
我需要有这样的事情:
struct A;
struct B {
A a;
};
struct A {
B b;
};
Run Code Online (Sandbox Code Playgroud)
谢谢!
任何人都知道一个好的实用程序或程序来询问所有项目的解决方案或目录,并告诉你循环引用的位置,并可能按顺序编译.
我记得前一段时间见过,但我无法在任何地方找到它.
我正在使用RavenDB与以下模型:
public class Cart {
List<Item> Items = new List<Item>();
}
public class Item {
public Cart Cart;
}
Run Code Online (Sandbox Code Playgroud)
当我添加Item到a时Cart,我将关系的两侧连接起来.
RavenDB如何处理序列化和反序列化? 引用Cart是自动分配还是有方法在加载时手动连接?
考虑两个抽象类alpha和beta:
[<AbstractClass>]
type alpha () =
abstract member foo: beta->beta
[<AbstractClass>]
and beta () = //***
abstract member bar: alpha
Run Code Online (Sandbox Code Playgroud)
如果我尝试编译,我得到一个错误,在***指示的行上:
error FS0010: Unexpected keyword 'and' in interaction
Run Code Online (Sandbox Code Playgroud)
如果我写:
[<AbstractClass>]
type alpha () =
abstract member foo: beta->beta
and beta () =
abstract member bar: alpha
Run Code Online (Sandbox Code Playgroud)
然后我得到:
error FS0365: No implementation was given for 'abstract member beta.bar : alpha'
Run Code Online (Sandbox Code Playgroud)
以及我应该添加AbstractClass属性的提示
那么我如何声明循环定义的抽象类?
.net f# abstract-class circular-dependency circular-reference
我想问一下在 Python 中使用委托模式是否会导致循环引用,如果是,那么实现它以确保对象及其委托被垃圾收集的最佳方法是什么?
在 Objective C 中,通过使用对委托的弱引用避免了上述问题。在 C++ 中,我们不会在委托上调用 delete。我在这里找到了 Python 弱参考模块的链接:http : //docs.python.org/library/weakref.html。似乎一种合理的方法可能是创建一个弱引用以使用此模块引用实例变量,但我不确定。
由于我在谷歌上搜索了这个问题并且无法找到答案,我想知道这是否是 Python 中的一个问题,或者是否有一个我不知道的通用解决方案(不需要weakref 模块)的?此外,我在提问之前确实搜索了 stackoverflow,但我发现的问题要么涉及循环导入,要么涉及一般的委托模式,而不是特定于 Python 和循环引用的问题。
预先感谢您的任何答复。
下面列出了一些玩具示例的代码,以帮助说明我的问题。我已经以这种方式实现了代码并且它可以工作,但是我不确定最后是否对内存进行了垃圾回收。
class A(object):
def __init__(self):
self.delegate = None
# Some other instance variables that keep track of state for performing some tasks.
def doSomething(self):
if self.delegate is not None:
self.delegate.doSomething()
else:
print('Cannot perform task because delegate is not set.')
# Other methods not shown.
class B(object):
def __init__(self):
self.a = A() # Need to keep object …Run Code Online (Sandbox Code Playgroud) 以下错误似乎在我的实时服务器上随机发生(即通过apache mod_wsgi)但从未在开发中(即localhost python manage.py runserver).
请注意,这种情况很少发生,并且不是可以轻松复制的内容,也不是每次访问特定网址时都可以复制的内容.
我已经看到在SO和谷歌上发布的各种答案,但似乎没有任何明确的原因,为什么会出现这种错误.也许这是因为错误是相当通用的,但最常见的答案似乎是由于循环导入错误.我看到的另一个答案是模型FK字段引用不是正确的情况(例如applabel.model而不是applabel.Model),但我的所有模型FK字段都是正确的.
错误的原因似乎指向我的一个admin.py文件.此文件最初从forms.py文件导入自定义表单类.admin.py文件和forms.py文件都从models.py文件中导入了相同的模型.因此,我将表单类移动到admin.py文件,以防此处出现循环引用但我偶尔会遇到这些错误.
任何人都可以解释为什么会出现这种错误以及为什么这么错误?我始终确保在代码更新后重新启动相关服务.
回溯是:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 101, in get_response
request.path_info)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 250, in resolve
for pattern in self.url_patterns:
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 279, in _get_url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 274, in _get_urlconf_module
self._urlconf_module = import_module(self.urlconf_name)
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/myproject/urls.py", line 6, in <module>
admin.autodiscover()
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/__init__.py", line 26, in autodiscover
import_module('%s.admin' % app)
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in …Run Code Online (Sandbox Code Playgroud) 我有2张桌子:
Empleados(**numEmpl**, nombre, apellido, sexo, telefono, salario, numDept)
Departamentos(**numDept**, nombreDept, numDirect)
Run Code Online (Sandbox Code Playgroud)
在出发中:
所以有一个循环引用.
首先我创建了表:
CREATE TABLE EMPLEADOS(numEmpl primary key, nombre,
apellido, sexo, telefono, salario, numDept)
CREATE TABLE DEPARTAMENTOS(numDept primary key, nombreDept, numDirect)
(i didn't write here each of type is each colum)
Run Code Online (Sandbox Code Playgroud)
现在我在它们之间创建引用:
ALTER TABLE DEPARTAMENTOS
ADD CONSTRAINT FK_DEPT_EMP FOREIGN KEY (numDirect)
REFERENCES EMPLEADOS(numEmpl)
ALTER TABLE EMPLEADOS
ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY (numDept)
REFERENCES DEPARTAMENTOS(numDept).
Run Code Online (Sandbox Code Playgroud)
它工作,所以现在我尝试插入一些数据:
INSERT INTO Empleados(numEmpl, nombre, apellidos, sexo, telefono, salario, numDept)
VALUES …Run Code Online (Sandbox Code Playgroud) 我已经实现了一个用于存储标记的类,标记集合必须是层次化的,所以我的类是:
public class Tag
{
public int Id { get; set; }
public int Description { get; set; }
public Tag ParentTag { get; set; }
// … (methods for get children, add and remove children, etc.)
}
Run Code Online (Sandbox Code Playgroud)
这样,根标签(用户希望能够拥有许多单独的树)没有父标记,而非根标记必须具有父标记.
这是实现层次结构的好方法吗?我发现复合模式,但在我的域中,所有标签都只是标签,对于域专家,父标签和子标签之间没有区别.
在测试中使用AutoFixture会出现问题; 当我需要创建一个简单的标签时,它会引发这个错误:
失败::
Ploeh.AutoFixture.ObjectCreationExceptionAutoFixture无法创建类型的实例,Ploeh.AutoFixture.Kernel.SeededRequest因为遍历的对象图包含循环引用.
编辑:我阅读使用AutoFixture创建递归树,但它是不同的情况:我只有一个类,而不是2,我不希望自动混合创建一个树,但只有一个节点
我是依赖注入的忠实粉丝,但有些事情困扰着我,我想知道是否有人可以给我一个解释:
创建两个相互依赖的服务是不可能的,因为我们会得到一个“循环引用”异常。我认为使用 symfony2 的每个人都遇到过这个错误。
虽然我非常理解这个错误,但有时我会遇到它,因为有很多服务,带来了复杂性……而且,也许还因为设计/调整服务并不容易。
因此,我想知道此错误的根本原因:
IE:
class MyService1{
private $service2;
public function __construct(){ //empty constructor
...
}
protected function init(MyService2 $service2, ...){
$this->service2 = $service2;
}
}
class MyService2{
private $service1;
public function __construct(){ //empty constructor
...
}
protected function init(MyService1 $service1, ...){
$this->service1 = $service1;
}
}
Run Code Online (Sandbox Code Playgroud)
然后实例化这两个服务:
$service1 = new MyService1();
$service2 = new MyService2();
$service1->init($service2);
$service2->init($service1);
Run Code Online (Sandbox Code Playgroud)
我很确定有些东西我没有深入理解。那么有人可以解释一下为什么我们被阻止在容器中创建循环引用吗?
谢谢
我有2个以下的循环引用类,为了方便,我没有放入getter和setter
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "i")
public class A{
int i;
B b1;
B b2;
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "i")
public class B {
int i;
AI a;
}
Run Code Online (Sandbox Code Playgroud)
如果A.b1和A.b2引用同一个B对象,我得到了序列化的json,如下所示:
{
"i": 1,
"b1": {
"i": 2,
"a": 1
},
"b2": 2
}
Run Code Online (Sandbox Code Playgroud)
但我的预期结果是:
{
"i": 1,
"b1": {
"i": 2,
"a": 1
},
"b2": {
"i": 2,
"a": 1
}
}
Run Code Online (Sandbox Code Playgroud)
我检查了jackson的源代码看起来像以前使用的对象的jackson store id/reference,如果任何其他对象使用相同的引用,那么它将使用id而不是序列化整个对象,如果对象保持在同一个循环链中,那就好了,但是如果他们不会停留在相同的链条中然后就像我的例子所示那样奇怪.
有人可以通过@identityinfo注释帮助我获得预期的结果吗?