Рубиновый метод, который возвращает себя
Я делаю некоторое отражение и сталкивался с неожиданным дорожным блоком.
Есть ли метод объекта в ruby (или рельсах), который возвращает себя
ruby-1.9.2> o = Object.new
=> #<Object:0x00000104750710>
ruby-1.9.2> o.class
=> Object
ruby-1.9.2> o.send :self
NoMethodError: undefined method `self' for #<Object:0x00000104750710>
Что я хочу
ruby-1.9.2> o.send :self
=> #<Object:0x00000104750710>
Является ли это встроенным? Или мне нужно расширить объект (всегда меня раздражает открытие объекта):
class Object
def itself
self
end
end
И тогда так:
ruby-1.9.2> o.send :itself
=> #<Object:0x00000104750710>
Хорошо, некоторый опыт того, чего я пытаюсь достичь. У меня есть общий помощник таблицы в моем приложении rails, и вы вызываете, если так:
render_list @person, [{field: :name, link_to: :itself},
{field: {address: :name}, link_to: :address}]
Я боролся по правильному пути, чтобы называть :itself
- но я думаю, что мой патч - это путь.
Ответы
Ответ 1
Да! Если у вас есть Ruby 2.2.0 или новее, вы можете использовать метод Kernel#itself
.
Вы можете увидеть обширное обсуждение этой функции здесь: https://bugs.ruby-lang.org/issues/6373. Патч был представлен Рафаэлем Франсой в сообщении № 53.
Вы можете увидеть это в официальном источнике Ruby, посмотрев object.c.
Ответ 2
Обсуждается вопрос о добавлении такого метода: http://bugs.ruby-lang.org/issues/6373
Ответ 3
Если вы используете версию Ruby >= 1.9, вы можете использовать метод tap
с пустым блоком:
Object.tap{} => Object
Object.new.tap{} => #<Object:0x5f41334>
Ответ 4
self
- это сам объект, нет необходимости дополнительно извлекать его. После вашего исправления попробуйте следующее:
>> a=[2,3,4] #=> [2, 3, 4]
>> a == a.itself #=> true
>> a.object_id #=> 71056290
>> a.itself.object_id #=> 71056290
... он точно такой же
Ответ 5
self
- это ключевое слово, ссылающееся на приемник по умолчанию. Это не метод. См. эту страницу для примера.
Ваш метод itself
работает нормально. Вы также можете сказать:
o.instance_eval('self')
Для класса используйте class_eval
вместо:
Object.class_eval('self')