Ruby数组#to#yaml不';t递归调用_yaml

Ruby数组#to#yaml不';t递归调用_yaml,ruby,yaml,Ruby,Yaml,下面的代码 require 'yaml' class MyObject def initialize(value) @value = value end def to_yaml() @value + @value end end puts [MyObject.new("a"), MyObject.new("b")] 在Ruby 2.1.3p242上生成以下输出: --- - !ruby/object:MyObject value: a - !ruby/

下面的代码

require 'yaml'

class MyObject
  def initialize(value)
    @value = value
  end

  def to_yaml()
    @value + @value
  end
end

puts [MyObject.new("a"), MyObject.new("b")]
在Ruby 2.1.3p242上生成以下输出:

---
- !ruby/object:MyObject
  value: a
- !ruby/object:MyObject
  value: b
在我期望的地方

---
- aa
- bb
就好像我对数组中的每个对象调用了
来_yaml

puts [MyObject.new("a").to_yaml, MyObject.new("b").to_yaml]

我做错了什么?

我正在替换
Psych::Visitors::YAMLTree的
visit\u数组
方法

class MyVisitor < Psych::Visitors::YAMLTree
  def visit_Array o
    super o.map { |i| i.respond_to?(:to_yaml) ? i.to_yaml : i }
  end
end
classmyvisitor
然后,我以这种方式倾倒YAML:

a = [MyObject.new("a"), MyObject.new("b")]
visitor = MyVisitor.create
visitor << a
puts visitor.tree.yaml
a=[MyObject.new(“a”),MyObject.new(“b”)]
visitor=MyVisitor.create

访问者我也保留了前面的答案,因为它可能对某些人有用,但这里有更好的解决方案

实际上,我把原来的问题简化了。我正在尝试将我的自定义对象呈现为YAML序列
[1,2,3,…]
。 前面的答案可能适用于呈现为字符串的对象

以下是工作版本:

require 'yaml'

class MyObject
  def initialize(value)
    @value = value
  end

  def encode_with coder
    coder.tag = nil
    coder.seq = [@value, @value]
  end
end

puts [MyObject.new("a"), MyObject.new("b")].to_yaml
一些参考资料: