How can I write a class and define operations between objects while avoiding cyclic reference?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By KonjacWyx
func bit_and(x:Bitset) -> Bitset:
var ret = Bitset.new(max(bits, x.bits))
for i in range(min(bitmasks.size(), x.bitmasks.size())):
	ret.bitmasks[i] = bitmasks[i] & x.bitmasks[i]
return ret
func bit_or(x:Bitset) -> Bitset:
var ret = Bitset.new(max(bits, x.bits))
for i in range(min(bitmasks.size(), x.bitmasks.size())):
	ret.bitmasks[i] = bitmasks[i] | x.bitmasks[i]
return ret
func bit_xor(x:Bitset) -> Bitset:
var ret = Bitset.new(max(bits, x.bits))
for i in range(min(bitmasks.size(), x.bitmasks.size())):
	ret.bitmasks[i] = bitmasks[i] ^ x.bitmasks[i]
return ret
func setminus(x:Bitset) -> void:
for i in range(bitmasks.size()):
	bitmasks[i] = bitmasks[i] ^ (bitmasks[i] & x.bitmasks[i])

Here’s the code I used. But obviously I am now facing the problem of cyclic reference. How can I solve this problem and realize the functions I want.

:bust_in_silhouette: Reply From: aXu_AP

Unfortunately this is a limitation in gdscript. You can do references to other objects, but can’t use static typing in this case. You can load a reference to the other script runtime and do checks. While it works, of course you won’t get autocompletion from that class.

var Bitset = load("res://PATH-TO-bitset.gd")
...
if x is Bitset:
    # This check should work
...
var x : Bitset # This doesn't work

Second option is to use duck typing.

In Godot 4 this problem will be gone.

Thank you for you help.

KonjacWyx | 2022-12-10 15:39