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

Рубиновый метод, который возвращает себя

Я делаю некоторое отражение и сталкивался с неожиданным дорожным блоком.

Есть ли метод объекта в 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 - но я думаю, что мой патч - это путь.

4b9b3361

Ответ 1

Да! Если у вас есть Ruby 2.2.0 или новее, вы можете использовать метод Kernel#itself.

Вы можете увидеть обширное обсуждение этой функции здесь: https://bugs.ruby-lang.org/issues/6373. Патч был представлен Рафаэлем Франсой в сообщении № 53.

Вы можете увидеть это в официальном источнике Ruby, посмотрев object.c.

Ответ 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')