你如何获得Ruby可枚举的底层对象的类?

时间:2012-03-07 23:47:47

标签: ruby

a = [4, 5, 3]
e = a.each
e.class #=> Enumerator
e.first.class #=> Fixnum

如何确定e是否是数组,哈希或其他类型的枚举器?

使用Ruby 1.9.2

3 个答案:

答案 0 :(得分:4)

你不能(轻松)。*

你也不应该。调查员并不打算关心他们所包含的内容,他们意味着要重复某些事情。无论如何,你可能不应该绕过枚举器:只需绕过实际的对象。

尽管如此,您可以使用[].each.inspect[]的正则表达式来解析{}这样的令人讨厌的事情,或者像#<Set: {}>这样的另一种类型的情况。但这太可怕了。我建议重新思考为什么你想要这样做 - 然后不要这样做。

*请注意,非简单的编程方式是使用Ruby C API编写C代码并点击枚举器中的实际对象指针。这需要完成,因为Enumerator是用C语言编写的,并导致像[].each.instance_variables这样的事情返回[]

答案 1 :(得分:1)

并不是说我认为这是合适的或以任何方式是个好主意,但你可以检查一个枚举器并可能得到一些信息,这些信息会给你一个基础对象的提示。当然,这引出了为什么你想要这样做的问题......

a = [1,2,3,4]
=> [1, 2, 3, 4]
e = a.each
=> #<Enumerator: ...>
e.inspect
=> "<#Enumerator: [1, 2, 3, 4]:each>"

a = { :foo => "bar" }
=> {:foo=>"bar"}
e = a.each
=> #<Enumerator: ...>    
e.inspect
=> "#<Enumerator: {:foo=>\"bar\"}:each>"

然后,您可以使用正则表达式来尝试梳理有关基础对象的信息。有可能这种情况不起作用(它适用于范围)。我再次强调,可能没有充分理由这样做。

答案 2 :(得分:0)

我暂时会说这无法完成。在创建枚举器时,似乎没有任何要求实际引用源对象本身,只是告诉枚举器如何到达下一个,当前等等...值