Как вы получаете класс нижележащего объекта в Ruby? - PullRequest
3 голосов
/ 08 марта 2012
a = [4, 5, 3]
e = a.each
e.class #=> Enumerator
e.first.class #=> Fixnum

Как узнать, является ли e перечислителем для массива, хэша или другого типа?

Работа в Ruby 1.9.2

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

Вы не можете (легко). *

И вы не сможете.Перечислители не должны заботиться о том, что в них содержится, они должны что-то перебирать.В любом случае, вы, вероятно, не должны обгонять перечислители: просто передавайте реальный объект.

Хотя вы можете делать такие неприятные вещи, как синтаксический анализ [].each.inspect с регулярным выражением для [] или {} илислучай, когда это другой тип, как #<Set: {}>.Но это так ужасно.Я предлагаю переосмыслить , почему вы хотите сделать это, а затем не делать этого.

* Обратите внимание, что непростым программным способом было бы написать код на C, используяRuby C API и нажмите на фактический указатель объекта в перечислителе.Это нужно сделать, потому что Enumerator написан на C и заставляет делать такие вещи, как [].each.instance_variables, чтобы возвращать [].

1 голос
/ 08 марта 2012

Не то чтобы я предлагал, что это подходит или каким-либо образом хорошая идея, но вы МОЖЕТЕ осмотреть счетчик и потенциально получить некоторую информацию, которая даст вам подсказку для базового объекта.Это, конечно, вызывает вопрос о том, почему вы хотели бы сделать это ...

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>"

Затем вы можете использовать регулярное выражение, чтобы попытаться выявить информацию о базовом объекте.Вероятно, есть случаи, когда это не будет работать (это работает для диапазонов).Я хотел бы еще раз подчеркнуть, что, вероятно, нет веских причин для этого.

0 голосов
/ 08 марта 2012

Я бы предварительно сказал, что это невозможно.Похоже, что при создании Enumerator не требуется фактически ссылаться на сам исходный объект, а только сказать Enumerator , как получить следующее, текущее и т. Д. Значения * 1003.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...