返回自身的Ruby方法

我正在做一些反思,遇到了意想不到的障碍。

ruby(或rails)中是否有一个返回自身的对象方法

ruby-1.9.2> o = Object.new => # ruby-1.9.2> o.class => Object ruby-1.9.2> o.send :self NoMethodError: undefined method `self' for # 

我想要的是

 ruby-1.9.2> o.send :self => # 

这是内置的吗? 或者我是否需要扩展Object(它总是让我紧张开放对象):

 class Object def itself self end end 

然后:

 ruby-1.9.2> o.send :itself => # 

好吧,我想要实现的一些背景知识。 我的rails应用程序中有一个通用的表助手,如果是这样的话你会打电话:

  render_list @person, [{field: :name, link_to: :itself}, {field: {address: :name}, link_to: :address}] 

我正在努力寻找正确的方式:itself – 但我认为我的补丁是要走的路。

是! 如果您使用Ruby 2.2.0或更高版本,则可以使用Kernel#itself方法。

您可以在此处查看此function的广泛讨论: https : //bugs.ruby-lang.org/issues/6373 。 该补丁由RafaelFrança在#53号消息中提交。

你可以通过查看object.c在官方的Ruby源代码中看到它。

有关添加此类方法的讨论: http : //bugs.ruby-lang.org/issues/6373

如果您使用的是Ruby版本> = 1.9,则可以使用带有空块的tap方法:

 Object.tap{} => Object Object.new.tap{} => # 

self 对象本身,无需额外获取它。 修补程序后,请尝试以下操作:

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

……它完全一样

self是指默认接收者的关键字。 这不是一种方法。 有关示例,请参阅此页面 。

itself方法工作正常。 你也可以说:

 o.instance_eval('self') 

对于类,请改用class_eval

 Object.class_eval('self') 

Smalltalk中有一个#yourself方法。 它有意义,因为语言的语法可以将多个消息发送到同一个对象,并希望在短语的末尾获取对象本身。

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

同样在Smalltalk中,方法的默认返回值是self,但在Ruby中,它是最后一条指令的返回值(如果方法中没有任何内容,则为nil)。 无论如何我们都应该开始使用显式返回:)

如果出于一些奇怪的逻辑原因你必须在某个对象上调用一个方法,但你想要的实际上是对象本身,那么我不明白为什么你不能扩展Object类来做到这一点。

除非该方法存在于其他地方(已经或将要存在)并且(或将会)做其他事情,否则它真的没有理由破坏你的程序。 表现可能略有损失?

试试.presence

 >> a=[2,3,4] => [2, 3, 4] >> a == a.presence => true