我正在做一些反思,并遇到意想不到的障碍。
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
- 但我认为我的补丁是要走的路。
答案 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