Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Roundtrip not possible when using identical array twice

Open
#800 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Quiet
Tech stack
ruby
Domain
backend

Research direction

Start by reproducing the YAML.load(YAML.dump({ a: a, b: a })) example and inspect Psych's YAML.load, YAML.dump, and alias-handling paths. The issue names no files or tests and does not define whether dumping or loading should change, so acceptance criteria need to be established before implementation.

Written by the indexing model from the issue text.

Description

tl;dr:

require "yaml"
a = [1,2,3]
YAML.load(YAML.dump({ a: a, b: a }))
# raises 'Psych::Visitors::NoAliasRuby#visit_Psych_Nodes_Alias': Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`. (Psych::AliasesNotEnabled)

Long form

Hey there, today I noticed an error that surprised me quite a lot. Essentially as soon as you include the same array twice in a structure that you dump through Psych, it will not be loadable using a default YAML.load. You'd have to pass specific options to make it loadable.

The problem is that dump will generate YAML in the form:

---
:a: &1
- 1
- 2
- 3
:b: *1

This preserves the array identity for the hashes stored under a and b.

That's surprising to me. I'd have expected that if load disables certain YAML features by default, that dump would also only use those on an opt-in basis. Even worse: I don't see a setting documented that would allow me to disable the alias creation. The two fixes available to me right now:

  • enable alias deserialization (which I believed to be disabled by default for security considerations; though I fail to find a source for that now)
  • duplicate values in my dump input to avoid alias generation

Second solution shown in code:

YAML.load(YAML.dump({ a: a, b: a.dup }))
=> {a: [1, 2, 3], b: [1, 2, 3]}
Dominant language
Ruby
Stars
597
Forks
223
Avg merge
11h 23m
Merged PRs (30d)
3

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from ruby/psych

All issues in ruby/psych

Similar issues

More Ruby issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.