我已经构建了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中元编程的众多陷阱之一!

09-27 01:49