Ruby Array#to_yaml 不递归调用 to_yaml
Ruby Array#to_yaml doesn't call to_yaml recursively
以下代码
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
好像我对数组中的每个对象都调用了 to_yaml
:
puts [MyObject.new("a").to_yaml, MyObject.new("b").to_yaml]
我做错了什么?
我正在替换 Psych::Visitors::YAMLTree
的 visit_Array
方法
class MyVisitor < Psych::Visitors::YAMLTree
def visit_Array o
super o.map { |i| i.respond_to?(:to_yaml) ? i.to_yaml : i }
end
end
然后,我将以这种方式转储 YAML:
a = [MyObject.new("a"), MyObject.new("b")]
visitor = MyVisitor.create
visitor << a
puts visitor.tree.yaml
我也将保留之前的答案,因为它可能对某些人有用,但这是更好的解决方案。
实际上我把原来的问题过于简单化了。我试图让我的自定义对象呈现为 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
部分参考资料:
http://blog.mustmodify.com/pages/psych-ruby-1-9-yaml
http://ruby-doc.org/stdlib-1.9.3/libdoc/psych/rdoc/Psych/Coder.html
以下代码
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
好像我对数组中的每个对象都调用了 to_yaml
:
puts [MyObject.new("a").to_yaml, MyObject.new("b").to_yaml]
我做错了什么?
我正在替换 Psych::Visitors::YAMLTree
visit_Array
方法
class MyVisitor < Psych::Visitors::YAMLTree
def visit_Array o
super o.map { |i| i.respond_to?(:to_yaml) ? i.to_yaml : i }
end
end
然后,我将以这种方式转储 YAML:
a = [MyObject.new("a"), MyObject.new("b")]
visitor = MyVisitor.create
visitor << a
puts visitor.tree.yaml
我也将保留之前的答案,因为它可能对某些人有用,但这是更好的解决方案。
实际上我把原来的问题过于简单化了。我试图让我的自定义对象呈现为 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
部分参考资料:
http://blog.mustmodify.com/pages/psych-ruby-1-9-yaml
http://ruby-doc.org/stdlib-1.9.3/libdoc/psych/rdoc/Psych/Coder.html