Why can't we use RefCell for recursive data structures?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
Why can't we use RefCell
for recursive data structures in Rust?
Invalid:
enum List {
Cons(i32, RefCell<List>),
Nil,
}
Valid:
enum List {
Cons(i32, Rc<List>), // or Box<List>
Nil,
}
rust
add a comment |
Why can't we use RefCell
for recursive data structures in Rust?
Invalid:
enum List {
Cons(i32, RefCell<List>),
Nil,
}
Valid:
enum List {
Cons(i32, Rc<List>), // or Box<List>
Nil,
}
rust
Is this similar enough to Why are recursive struct types illegal in Rust? that it can be closed as a duplicate?
– trentcl
Jan 3 at 17:12
This question is different. I understand why recursive types are invalid and that we can solve that using indirection. But I assume all smart pointers provide indirection since, after all, they are pointers. So my question is is why doesn't RefCell provide indirection?
– sidoshi
Jan 4 at 4:27
add a comment |
Why can't we use RefCell
for recursive data structures in Rust?
Invalid:
enum List {
Cons(i32, RefCell<List>),
Nil,
}
Valid:
enum List {
Cons(i32, Rc<List>), // or Box<List>
Nil,
}
rust
Why can't we use RefCell
for recursive data structures in Rust?
Invalid:
enum List {
Cons(i32, RefCell<List>),
Nil,
}
Valid:
enum List {
Cons(i32, Rc<List>), // or Box<List>
Nil,
}
rust
rust
edited Jan 6 at 2:37
Shepmaster
162k16332477
162k16332477
asked Jan 3 at 12:37
sidoshisidoshi
4711416
4711416
Is this similar enough to Why are recursive struct types illegal in Rust? that it can be closed as a duplicate?
– trentcl
Jan 3 at 17:12
This question is different. I understand why recursive types are invalid and that we can solve that using indirection. But I assume all smart pointers provide indirection since, after all, they are pointers. So my question is is why doesn't RefCell provide indirection?
– sidoshi
Jan 4 at 4:27
add a comment |
Is this similar enough to Why are recursive struct types illegal in Rust? that it can be closed as a duplicate?
– trentcl
Jan 3 at 17:12
This question is different. I understand why recursive types are invalid and that we can solve that using indirection. But I assume all smart pointers provide indirection since, after all, they are pointers. So my question is is why doesn't RefCell provide indirection?
– sidoshi
Jan 4 at 4:27
Is this similar enough to Why are recursive struct types illegal in Rust? that it can be closed as a duplicate?
– trentcl
Jan 3 at 17:12
Is this similar enough to Why are recursive struct types illegal in Rust? that it can be closed as a duplicate?
– trentcl
Jan 3 at 17:12
This question is different. I understand why recursive types are invalid and that we can solve that using indirection. But I assume all smart pointers provide indirection since, after all, they are pointers. So my question is is why doesn't RefCell provide indirection?
– sidoshi
Jan 4 at 4:27
This question is different. I understand why recursive types are invalid and that we can solve that using indirection. But I assume all smart pointers provide indirection since, after all, they are pointers. So my question is is why doesn't RefCell provide indirection?
– sidoshi
Jan 4 at 4:27
add a comment |
1 Answer
1
active
oldest
votes
RefCell
contains the object inside, wrapping it, it's not a heap allocated value. That's why the compiler says "recursive without indirection": RefCell
is not an indirection.
Box
and Rc
, on the other hand, contain a reference to an object allocated somewhere else, and therefore are indirections.
Without an indirection, the List
enum ends up being infinite since every Cons
contains a full List
enum inside its RefCell
.
You can not do recursive data structures that contain themselves as values, only as pointers or references.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54022450%2fwhy-cant-we-use-refcell-for-recursive-data-structures%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
RefCell
contains the object inside, wrapping it, it's not a heap allocated value. That's why the compiler says "recursive without indirection": RefCell
is not an indirection.
Box
and Rc
, on the other hand, contain a reference to an object allocated somewhere else, and therefore are indirections.
Without an indirection, the List
enum ends up being infinite since every Cons
contains a full List
enum inside its RefCell
.
You can not do recursive data structures that contain themselves as values, only as pointers or references.
add a comment |
RefCell
contains the object inside, wrapping it, it's not a heap allocated value. That's why the compiler says "recursive without indirection": RefCell
is not an indirection.
Box
and Rc
, on the other hand, contain a reference to an object allocated somewhere else, and therefore are indirections.
Without an indirection, the List
enum ends up being infinite since every Cons
contains a full List
enum inside its RefCell
.
You can not do recursive data structures that contain themselves as values, only as pointers or references.
add a comment |
RefCell
contains the object inside, wrapping it, it's not a heap allocated value. That's why the compiler says "recursive without indirection": RefCell
is not an indirection.
Box
and Rc
, on the other hand, contain a reference to an object allocated somewhere else, and therefore are indirections.
Without an indirection, the List
enum ends up being infinite since every Cons
contains a full List
enum inside its RefCell
.
You can not do recursive data structures that contain themselves as values, only as pointers or references.
RefCell
contains the object inside, wrapping it, it's not a heap allocated value. That's why the compiler says "recursive without indirection": RefCell
is not an indirection.
Box
and Rc
, on the other hand, contain a reference to an object allocated somewhere else, and therefore are indirections.
Without an indirection, the List
enum ends up being infinite since every Cons
contains a full List
enum inside its RefCell
.
You can not do recursive data structures that contain themselves as values, only as pointers or references.
edited Jan 6 at 2:38
Shepmaster
162k16332477
162k16332477
answered Jan 3 at 12:47
Arkaitz JimenezArkaitz Jimenez
16.2k86395
16.2k86395
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54022450%2fwhy-cant-we-use-refcell-for-recursive-data-structures%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Is this similar enough to Why are recursive struct types illegal in Rust? that it can be closed as a duplicate?
– trentcl
Jan 3 at 17:12
This question is different. I understand why recursive types are invalid and that we can solve that using indirection. But I assume all smart pointers provide indirection since, after all, they are pointers. So my question is is why doesn't RefCell provide indirection?
– sidoshi
Jan 4 at 4:27