返回自身的Ruby方法

Jon*_*han 31 ruby reflection ruby-on-rails

我正在做一些反思,遇到意想不到的路障.

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>
Run Code Online (Sandbox Code Playgroud)

我想要的是

ruby-1.9.2> o.send :self
 => #<Object:0x00000104750710> 
Run Code Online (Sandbox Code Playgroud)

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

class Object

  def itself
    self
  end

end
Run Code Online (Sandbox Code Playgroud)

然后:

ruby-1.9.2> o.send :itself
 => #<Object:0x00000104750710> 
Run Code Online (Sandbox Code Playgroud)

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

  render_list @person, [{field: :name, link_to: :itself},
                        {field: {address: :name}, link_to: :address}]
Run Code Online (Sandbox Code Playgroud)

我正在努力寻找合适的方式:itself- 但我认为我的补丁是要走的路.

Dav*_*son 41

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

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

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


Ale*_*xey 6

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

  • 凉!所以我不是疯了! (2认同)

Bit*_*rse 5

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

Object.tap{}     => Object
Object.new.tap{} => #<Object:0x5f41334>
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,所需的块意味着你不能只是传递一个引用:盲目地点击,你必须确保总是用块来调用它. (3认同)