Метод Ruby, который возвращает себя - PullRequest
30 голосов
/ 10 июня 2011

Я немного размышлял и натолкнулся на неожиданный блок.

Есть ли метод объекта в ruby ​​(или rails), который возвращает себя

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 - но я думаю, что мой патчпуть.

Ответы [ 7 ]

41 голосов
/ 17 сентября 2014

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

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

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

6 голосов
/ 11 июля 2012

Существует обсуждение о добавлении такого метода: http://bugs.ruby -lang.org / Issues / 6373

5 голосов
/ 10 июня 2011

Если вы используете версию Ruby> = 1.9, вы можете использовать метод tap с пустым блоком:

Object.tap{}     => Object
Object.new.tap{} => #<Object:0x5f41334>
4 голосов
/ 10 июня 2011

self - это сам объект, нет необходимости его извлекать. После вашего патча попробуйте следующее:

>> a=[2,3,4] #=> [2, 3, 4]
>> a == a.itself #=> true
>> a.object_id #=> 71056290
>> a.itself.object_id #=> 71056290

... это точно так же

3 голосов
/ 10 июня 2011

self - ключевое слово, относящееся к получателю по умолчанию. Это не метод. См. эту страницу для примера.

Ваш itself метод работает нормально. Вы также можете сказать:

o.instance_eval('self')

Для класса используйте class_eval вместо:

Object.class_eval('self')
0 голосов
/ 03 июня 2018

Попробуйте .presence

>> a=[2,3,4]
 => [2, 3, 4] 
>> a == a.presence
 => true 
0 голосов
/ 16 марта 2018

В Smalltalk есть метод #yourself. Это имеет смысл из-за синтаксиса языка, в котором вы можете отправить несколько сообщений одному и тому же объекту и захотеть получить сам объект в конце фразы.

aList add: (anObjet doThis; andThat; yourself).

Также в Smalltalk возвращаемым значением по умолчанию для метода является self, но в Ruby это возвращаемое значение последней инструкции (или nil, если в методе ничего нет). В любом случае, может быть, мы все должны начать использовать явные возвраты:)

Если по какой-то странной логической причине вам нужно вызвать метод для какого-то объекта, но на самом деле вам нужен сам объект, то я не понимаю, почему вы не смогли расширить класс Object для этого.

На самом деле нет никаких причин, по которым она может сломать вашу программу, если метод не существует где-то еще (существовал или будет существовать) и не делал (или будет) делать что-то еще. Может быть, небольшая потеря производительности?

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