繁体   English   中英

找出Ruby / Rails中定义方法的位置(而不是Java)

[英]Finding out where methods are defined in Ruby/Rails (as opposed to Java)

我刚刚开始使用Ruby on Rails。 来自Java世界,我想知道的一件事是Ruby / Rails开发人员如何找出实际定义方法的位置。

我习惯于单击Eclipse中的方法来查找即使在第三方库中定义的位置(假设我有源代码)。

一个具体的例子:我试图找出Authlogic gem如何显然改变我的User类的构造函数以要求一个额外的参数(称为:password_confirmation),即使User类甚至没有继承任何与Authlogic相关的东西。

可能我只是忽略了一些非常明显的东西(或许我仍然无法围绕整个“约定配置”的事情;-))

快速找到像Ruby这样的动态语言的方法位置有点困难。

您可以使用object.methodsobject.instance_methods快速找到方法。

如果您使用的是Ruby 1.9,则可以执行以下操作:

object.method(:method_name).source_location 

有关source_location的更多信息 - 请单击此处

Pry宝石专为这种探索性使用案例而设计。

Pry是一个交互式shell,它允许您使用类似shell的命令(如cdls浏览程序的源代码。

您可以为所遇到的任何方法提取文档,甚至可以查看源代码,包括某些情况下的本机C代码(使用pry-doc插件)。 您甚至可以直接跳转到使用edit-method命令定义特定方法的文件/行。 show-methodshow-doc命令还显示了它们所采用的方法的精确位置。

观看railscast截屏视频以获取更多信息。

以下是一些示例:

pry(main)> show-doc OpenStruct#initialize

From: /Users/john/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/ostruct.rb @ line 46:
Number of lines: 11

visibility:  private
signature:  initialize(hash=?)

Create a new OpenStruct object.  The optional hash, if given, will
generate attributes and values.  For example.

  require 'ostruct'
  hash = { "country" => "Australia", :population => 20_000_000 }
  data = OpenStruct.new(hash)

  p data        # -> <OpenStruct country="Australia" population=20000000>

By default, the resulting OpenStruct object will have no attributes.

pry(main)> 

您还可以使用show-method命令查找源代码:

pry(main)> show-method OpenStruct#initialize

From: /Users/john/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/ostruct.rb @ line 46:
Number of lines: 9

def initialize(hash=nil)
  @table = {}
  if hash
    for k,v in hash
      @table[k.to_sym] = v
      new_ostruct_member(k)
    end
  end
end
pry(main)> 

有关更多信息,请访问http://pry.github.com :)

没有人建议Pry gem提到了名为find-method ,这可能是作者所寻求的。

这是一个例子:

pry(main)> find-method current_user

Devise::Controllers::Helpers
Devise::Controllers::Helpers#current_user
WebsocketRails::ConnectionAdapters::Base
WebsocketRails::ConnectionAdapters::Base#current_user_responds_to?

然后,您可以按照@banister的提示浏览方法代码。

你可以用像撬的东西。 另见其railscast

有几种方法可以更改现有类。 例如,如果要修改String类,请执行以下操作:

class String
  def my_custom_method
    puts "hello!"
  end
end

但是还有其他选项,比如混合模块或使用元编程添加/修改方法。

无论如何,有一些对象,你总是可以:

puts obj.methods.inspect

要么在代码中执行,要么使用调试器。

另一种选择是阅读代码。 特别是你应该阅读gem的单元测试(./spec,...)。 有很多作者说单元测试使文档过时了。

在Ruby中,您还可以使用mixins将class和instance方法添加到给定的类中。

基本上,如果您有一个模块,您可以使用includeextend类方法将其方法添加到给定的类。 关于这些如何工作的简短示例如下

Module A
  def foo
    "foo"
  end
end

Module B
  def bar
    "bar"
  end
end

Class YourClass
  include A
  extend B
end

p YourClass.new.foo # gives "foo" because the foo method is added as instance method
p YourClass.bar     # gives "baz" because the bar method is added as class method

因为Ruby是一种动态语言,所以这些语句可以在任何地方使用。 因此,为了解决您的问题,不需要扩展authlogic类来获取其方法。 许多插件在加载时使用此指令

ActiveRecord::Base.send :include, ModuleName

通过这种方式,它们告诉每个AR对象包含一些插件定义的模块,并获得AR对象中的所有方法。

许多acts_as插件使用的另一种技术是仅在基类中使用acts_as调用时才包含其模块。

其他有用的参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM