返回自身的Ruby方法

时间:2011-06-10 15:22:36

标签: ruby-on-rails ruby reflection

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

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> 

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

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 个答案:

答案 0 :(得分:41)

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

如果您使用的是Ruby版本&gt; = 1.9,则可以将tap方法与空块一起使用:

Object.tap{}     => Object
Object.new.tap{} => #<Object:0x5f41334>

答案 3 :(得分:4)

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

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

......它完全一样

答案 4 :(得分:3)

self是一个引用默认接收器的关键字。这不是一种方法。有关示例,请参阅this page

您的itself方法正常。你也可以说:

o.instance_eval('self')

对于课程,请改用class_eval

Object.class_eval('self')

答案 5 :(得分:0)

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

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

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

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

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

答案 6 :(得分:0)

尝试.presence

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