标签: circular-reference

有没有办法在纯PHP中检测循环数组?

我正在尝试在PHP中实现自己的序列化/ var_dump样式函数.如果存在圆形阵列(有)的可能性似乎是不可能的.

在最近的PHP版本中,var_dump似乎检测到循环数组:

php > $a = array();
php > $a[] = &$a;
php > var_dump($a);
array(1) {
  [0]=>
  &array(1) {
    [0]=>
    *RECURSION*
  }
}
Run Code Online (Sandbox Code Playgroud)

我如何在PHP中实现我自己的序列化类型的方法,可以类似地检测?我不能只是跟踪我访问过的数组,因为数组在PHP严格比较返回包含相同的元素,并比较圆形阵列导致致命错误,反正不同的阵列真.

php > $b = array(1,2);
php > $c = array(1,2);
php > var_dump($b === $c);
bool(true)
php > $a = array();
php > $a[] = &$a;
php > var_dump($a === $a);
PHP Fatal error:  Nesting level too deep - recursive dependency? in php shell code on line 1
Run Code Online (Sandbox Code Playgroud)

我找了一种方法来找到一个数组的唯一id(指针),但我找不到一个.spl_object_hash仅适用于对象,而不适用于数组.如果我将多个不同的数组转换为对象,它们都会获得相同的spl_object_hash值(为什么?).

编辑:

在每个数组上调用print_r,var_dump或serialize,然后使用某种机制来检测这些方法检测到的递归的存在是算法复杂性的噩梦,并且基本上会使任何使用太慢而不能在大型嵌套数组上实用.

接受的回答: …

php arrays recursion identity circular-reference

19
推荐指数
1
解决办法
2931
查看次数

创建循环通用引用

我正在编写一个应用程序来在对等网络中进行一些分布式计算.在定义网络时,我有两类P2PNetwork和P2PClient.我希望这些是通用的,因此有以下定义:

P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>

P2PClient<T extends P2PNetwork<? extends T>>
Run Code Online (Sandbox Code Playgroud)

用P2PClient定义setNetwork(T网络)的方法.我希望用这段代码描述的是:

  1. P2P网络由特定类型的客户端构成
  2. P2PClient可能只属于其客户端与此客户端具有相同类型的网络(循环引用)

这似乎对我来说是正确的,但如果我尝试创建一个非泛型版本,如

MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
Run Code Online (Sandbox Code Playgroud)

和其他变种我从编译器收到很多错误.所以我的问题如下:

  1. 是否可以使用通用的循环引用(我从未见过明确禁止它的任何内容)?
  2. 上述通用定义是否是这种循环关系的正确定义?
  3. 如果它是有效的,它是描述这种关系的"正确"方式(即是否有另一个有效的定义,这在风格上是首选的)?
  4. 在给定正确的通用定义的情况下,如何正确定义客户端和服务器的非泛型实例?

java generics crtp circular-reference

17
推荐指数
1
解决办法
3069
查看次数

Json和Java - 循环参考

我有并且发布了循环参考.

我有Rest Webservices将对象返回到前端,问题是当我尝试返回具有多个引用的对象时,结果我得到无限响应,生成

java.lang.IllegalStateException: 
    Cannot call sendError() after the response has been committed
Run Code Online (Sandbox Code Playgroud)

这些对象是由Hibernate代码生成自动生成的,我需要在后端使用循环引用,我只需要在使用Jackson将信息发送到前端之前将其删除.

控制器方法标题是:

@RequestMapping(value="/list", method=RequestMethod.POST)
public @ResponseBody eventResponse list(@RequestBody String sessionID) {
Run Code Online (Sandbox Code Playgroud)

我没有做任何明确的转换为Json,我是一个新手,我认为杰克逊自动解决了这个问题.

java json circular-reference jackson

17
推荐指数
2
解决办法
2万
查看次数

如何避免循环单位参考?

想象一下国际象棋游戏的以下两类:

TChessBoard = class
private
  FBoard : array [1..8, 1..8] of TChessPiece;
...
end;

TChessPiece = class abstract
public
   procedure GetMoveTargets (BoardPos : TPoint; Board : TChessBoard; MoveTargetList : TList <TPoint>);
...
end;
Run Code Online (Sandbox Code Playgroud)

我希望在两个单独的ChessBoard.pasChessPiece.pas单元中定义这两个类.

如何避免我遇到的圆形单元参考(在另一个单元的接口部分需要每个单元)?

delphi project-organization circular-reference

16
推荐指数
3
解决办法
1万
查看次数

在Nodejs中,当我在console.log中有一个req对象时,[Circular]引用了什么?如何确定

在Nodejs中,当我在console.log中有一个req对象时,[Circular]是什么意思?

这是针对基本nodejs示例的示例console.log(req).请注意,request.socket._readWatcher.socket是[Circular].这是否意味着它指的是自己?我该如何取消引用?

{ socket: 
   { bufferSize: 0,
     fd: 7,
     type: 'tcp4',
     allowHalfOpen: true,
     _readWatcher: 
      { socket: [Circular],
        callback: [Function: onReadable] },
     destroyed: false,
     readable: true,
     _writeQueue: [],
     _writeQueueEncoding: [],
     _writeQueueFD: [],
     _writeQueueCallbacks: [],
     _writeWatcher: 
      { socket: [Circular],
        callback: [Function: onWritable] },
     writable: true,
     _writeImpl: [Function],
     _readImpl: [Function],
     _shutdownImpl: [Function],
     remoteAddress: '127.0.1.1',
     remotePort: 40407,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        watcher: [Object],
        _events: [Object],
        httpAllowHalfOpen: false,
        type: 'tcp4',
        fd: 5 },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { repeat: 120,
        _idleNext: [Circular], …
Run Code Online (Sandbox Code Playgroud)

v8 circular-reference node.js

16
推荐指数
2
解决办法
1万
查看次数

在C中初始化循环数据.这个有效的C代码是否符合任何标准?

我想看看我是否可以初始化一个全局变量来指向自己:

#include <stdio.h>
struct foo { struct foo *a, *b; } x = { &x, &x };
int main()
{
    printf("&x = %p, x.a = %p, x.b = %p\n", &x, x.a, x.b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码编译并按预期运行gcc(所有三个指针打印相同).

我想知道:

  1. 这可靠吗?
  2. 这是标准吗?
  3. 这是便携式吗?

编辑:只是为了澄清,我质疑x其自己的初始化程序中的地址的可用性.

c gcc recursive-datastructures circular-reference static-initialization

16
推荐指数
2
解决办法
302
查看次数

循环引用有哪些解决方案?

使用引用计数时,有哪些可能的解决方案/技术来处理循环引用?

最着名的解决方案是使用弱引用,但是关于该主题的许多文章暗示也存在其他方法,但是不断重复弱引用示例.这让我想知道,这些其他方法是什么?

  • 我不是问什么是引用计数的替代方法,而是使用引用计数时循环引用的解决方案是什么.

  • 这个问题不是关于任何具体问题/实施/语言而是一般性问题.

reference-counting circular-reference

15
推荐指数
2
解决办法
8705
查看次数

在Delphi中绕过循环引用

有没有办法在Delphi中绕过循环单元引用?

也许是更新版本的delphi或某些魔法黑客或其他东西?

我的delphi项目有10万多行代码,主要基于单例类.我需要重构这个,但这意味着几个月的"循环引用"地狱:)

delphi circular-reference

15
推荐指数
4
解决办法
1万
查看次数

Chrome/V8不垃圾收集循环引用?

看一下Chrome堆快照的这一部分:

Chrome循环参考

它显示了堆中对象的保留器,据我所知并且可以看到,它应该是垃圾,但是尽管如此,它仍然没有被收集.

毕竟,到根的"最短"路径是一条循环路径(它实际上从未到达根路径).令人不禁的是,快照查看器如何能够为它分配12的距离?这只是在放弃之前整个周期所采取的步骤数量吗?注意距离永远不会低于11.

我已经读过,可能需要几次迭代来清理带有循环引用的子图.但是重复强制收集(使用"时间轴"选项卡中的垃圾箱按钮)无法清除这些对象.

请注意,通过'185'引用进行探索最终会导致相同system / Context @862399,因此确实没有从根到此对象的路径(至少在此处不可见).

我疯了,还是垃圾收集器真的坏了?我不记得过去有过这个问题.我在Chrome 45.0.2454.101上.Beta 46.0.2490.64表现相同.

javascript garbage-collection google-chrome v8 circular-reference

15
推荐指数
1
解决办法
1417
查看次数

在Haskell解开结的任何好工具?

我有一个具有几种不同类型的内部循环链接的数据结构,从cycle命令的意义上讲它是无限的.是否有任何有趣的模块可以将这些结构折叠成使用索引的平面数据结构?

我感兴趣的序列化完整的数据结构,既通过ReadShow以及通过Data.Serialize或相似.

构建顺序索引显然有很好的功能,但基于内存地址哈希值的索引也可以正常工作.

haskell circular-reference

14
推荐指数
2
解决办法
1121
查看次数