我已经构建了hash的一个子类,每当我用类的一个实例作为参数调用puts
时,就会得到以下结果:
> puts data
TypeError: can't convert Reporting::Search::Data to Array (Reporting::Search::Data#to_ary gives Reporting::Search::Data)
有人知道该怎么办吗?我希望它输出散列的字符串表示,就像用普通散列调用
puts
一样。我的课很简单:
class Data < HashWithIndifferentAccess
def method_missing meth, *args, &block
if meth.to_s =~ /=$/
send :[]=, meth.slice(0...-1), *args
elsif args.empty?
fetch meth, Data.new
else
super meth, *args, &block
end
end
def compact!
delete_if do |k,v|
v.compact! if v.is_a?(Data)
v.blank?
end
end
end
最佳答案
问题似乎与您使用method_missing
有关。
当您调用puts
时,它尝试以人类可读的形式输出对象,因此它对对象调用to_ary
但是,您还没有在类上定义to_ary
,因此它会返回到method_missing
,在那里它会变得混乱并失败。
定义,to_ary
为存根,我不再得到错误。
def to_ary
end
这是ruby中元编程的众多陷阱之一!