如何在没有继承方法的情况下获取类的公共方法?
Posted
技术标签:
【中文标题】如何在没有继承方法的情况下获取类的公共方法?【英文标题】:How do I get the public methods of a class without inherited methods? 【发布时间】:2012-02-09 08:55:28 【问题描述】:给定任何对象,我可以调用#public_methods
并查看它将响应的所有方法。但是,我发现有时快速列出所有未继承的公共方法(即真正属于此类的内容)的列表会很方便。
我在“Easy way to list public methods for a Ruby object”中发现如果我使用:
(Foo.public_methods - Object.public_methods).sort
我可以过滤掉很多基本的 Ruby 内容。我希望能够过滤一直沿链继承的所有内容。如果我知道父类,我可以使用它进行过滤,但我想提出一个通用命令,它可以为任何对象返回一个未继承的公共方法数组。
【问题讨论】:
【参考方案1】:只需将false
传递给inherited
的public_methods
参数即可:
"hello".public_methods.include?(:dup) # => true
"hello".public_methods(false).include?(:dup) # => false
不是您的问题的答案,但如果您不知道,irb
会自动完成,因此很容易获得公共方法的列表(尤其是如果您知道要查找的方法的开头) .只需点击标签;点击两次将列出所有可能性(但包括继承的可能性):
> "nice".d<tab><tab>
"nice".delete "nice".delete! "nice".display "nice".downcase
"nice".downcase! "nice".dump "nice".dup "nice".define_singleton_method
> "nice".<tab><tab>
Display all 162 possibilities? (y or n)
...
使用pry
可以更轻松地查看可用方法,按继承级别细分:
[1] pry(main)> cd "nice"
[2] pry("nice"):1> ls
Comparable#methods: < <= > >= between?
String#methods: % * + << <=> == === =~ [] []= ascii_only? bytes bytesize byteslice capitalize capitalize! casecmp center chars chomp chomp! chop chop! chr clear codepoints concat count crypt delete delete! downcase downcase! dump each_byte each_char each_codepoint each_line empty? encode encode! encoding end_with? eql? force_encoding getbyte gsub gsub! hash hex include? index insert inspect intern length lines ljust lstrip lstrip! match next next! oct ord partition prepend replace reverse reverse! rindex rjust rpartition rstrip rstrip! scan setbyte shellescape shellsplit size slice slice! split squeeze squeeze! start_with? strip strip! sub sub! succ succ! sum swapcase swapcase! to_c to_f to_i to_r to_s to_str to_sym tr tr! tr_s tr_s! unpack upcase upcase! upto valid_encoding?
locals: _ _dir_ _ex_ _file_ _in_ _out_ _pry_
【讨论】:
您的意思是irb
还是irc
? :-)
确实,irb
。谢谢你和@Mu
啊,超级有帮助!我没有意识到#public_methods
接受了任何论据,我什至没有想到要检查。谢谢!【参考方案2】:
看看Module#instance_methods。该方法有一个布尔参数include_super
是否也返回继承的方法。默认值为 true。
您可以使用以下内容:
class A
def method_1
puts "method from A"
end
end
class B < A
def method_2
puts "method from B"
end
end
B.instance_methods # => [:method_1, :method_2, ...]
B.instance_methods(false) # => [:method_2]
【讨论】:
顺便说一句,Object
上的可比较方法称为public_methods
,参见ruby-doc.org/core-2.5.1/Object.html#method-i-public_method。方法instance_methods
在Module
上,见ruby-doc.org/core-2.5.1/Module.html#method-i-instance_methods。以上是关于如何在没有继承方法的情况下获取类的公共方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 instagram API 的情况下从 instagram 获取公共用户的所有帖子
您可以强制从抽象基类继承的类仅具有在基本情况下定义的公共方法吗?