a = [4, 5, 3]
e = a.each
e.class #=> Enumerator
e.first.class #=> Fixnum
如何确定e是否是数组,哈希或其他类型的枚举器?
使用Ruby 1.9.2
答案 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)
我暂时会说这无法完成。在创建枚举器时,似乎没有任何要求实际引用源对象本身,只是告诉枚举器如何到达下一个,当前等等...值