summaryrefslogtreecommitdiff
path: root/class.c
diff options
context:
space:
mode:
authorzverok <zverok.offline@gmail.com>2022-01-25 00:31:12 +0200
committerVictor Shepelev <zverok.offline@gmail.com>2022-12-11 18:43:44 +0200
commitf07897fd7bb53a40a8fad5ee2be74e02b53e8614 (patch)
tree5c2b50f49e17018d28c7744b1419bea0cbe64288 /class.c
parent73eddee76efdc4ed255fd13533b4a0a329cf3b1a (diff)
downloadruby-f07897fd7bb53a40a8fad5ee2be74e02b53e8614.tar.gz
[DOC] Clarify Class#subclases behavior quirks
As per discussion in [Feature #18273], explain the non-deterministic nature of the method.
Diffstat (limited to 'class.c')
-rw-r--r--class.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/class.c b/class.c
index 55bc761ebe..847c4d0a57 100644
--- a/class.c
+++ b/class.c
@@ -1572,6 +1572,27 @@ class_descendants(VALUE klass, bool immediate_only)
* A.subclasses #=> [D, B]
* B.subclasses #=> [C]
* C.subclasses #=> []
+ *
+ * Anonymous subclasses (not associated with a constant) are
+ * returned, too:
+ *
+ * c = Class.new(A)
+ * A.subclasses # => [#<Class:0x00007f003c77bd78>, D, B]
+ *
+ * Note that the parent does not hold references to subclasses
+ * and doesn't prevent them from being garbage collected. This
+ * means that the subclass might disappear when all references
+ * to it are dropped:
+ *
+ * # drop the reference to subclass, it can be garbage-collected now
+ * c = nil
+ *
+ * A.subclasses
+ * # It can be
+ * # => [#<Class:0x00007f003c77bd78>, D, B]
+ * # ...or just
+ * # => [D, B]
+ * # ...depending on whether garbage collector was run
*/
VALUE