Подтвердить что ты не робот

Имеет ли рубин функцию идентификации, т.е. X.fn == x, для всех x?

Иногда, когда я передаю имя метода в качестве аргумента, я нахожусь в поиске функции идентификации, такой, что any_obj.send(:identity) == any_obj, поэтому вместо этого:

(transform.nil?) ? my_obj : my_obj.send(transform)

Я мог просто написать

my_obj.send(transform || :identity)

(Это немного надуманный пример - функция идентификации может сделать больше, чем сэкономить несколько нажатий клавиш в более сложных примерах.)

Было бы достаточно легко открыть определение объекта и добавить его, но есть ли что-то уже там, что я забыл? Кто-нибудь еще хочет этого?

P.S.: Я знаю, что мой пример действительно должен быть указан any_obj.send(:identity).equal?(any_obj), но иногда педантизм скрывает вопрос.

4b9b3361

Ответ 1

Да. Вы ищете Object#itself, который доступен в Ruby 2.2 +.

Из документов:

сам → an_object

Возвращает obj.

string = 'my string' #=> "my string"
string.itself.object_id == string.object_id #=> true

Ответ 3

На данный момент этого нет, но Мац высказал мнение о том, что такой метод будет реализован: https://bugs.ruby-lang.org/issues/6373. Вероятно, он будет реализован в будущих версиях Ruby.