String.methods.include?(:upcase)=>false,但在ruby-doc.org中列出了“.upcase”

String.methods.include?(:upcase)=>false,但在ruby-doc.org中列出了“.upcase”,ruby,string,api,Ruby,String,Api,我在irb中玩了一些字符串,发现自己在理解以下代码的含义时遇到了困难: String.methods => [:try_convert, :allocate, :new, :superclass, :freeze, :===, :==, :<=>, :<, :<=, :>, :>=, :to_s, :included_modules, :include?, :name, :ancestors, :instance_methods, :public_in

我在irb中玩了一些字符串,发现自己在理解以下代码的含义时遇到了困难:

String.methods
=> [:try_convert, :allocate, :new, :superclass, :freeze, :===, :==, :<=>, :<, :<=, :>,
:>=, :to_s, :included_modules, :include?, :name, :ancestors, :instance_methods, 
:public_instance_methods, :protected_instance_methods, :private_instance_methods, 
:constants, :const_get, :const_set, :const_defined?, :const_missing, :class_variables, 
:remove_class_variable, :class_variable_get, :class_variable_set, 
:class_variable_defined?, :public_constant, :private_constant, :module_exec, :class_exec, 
:module_eval, :class_eval, :method_defined?, :public_method_defined?, 
:private_method_defined?, :protected_method_defined?, :public_class_method, 
:private_class_method, :autoload, :autoload?, :instance_method, :public_instance_method, 
:nil?, :=~, :!~, :eql?, :hash, :class, :singleton_class, :clone, :dup, :initialize_dup, 
:initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :frozen?, 
:inspect, :methods, :singleton_methods, :protected_methods, :private_methods, 
:public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, 
:instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, 
:respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, 
:define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, 
:instance_eval, :instance_exec, :__send__, :__id__] 
但将.upcase方法列为类字符串的方法

当然,在我的irb会话或编辑器中,ruby完全理解执行

"whatdoiknow".upcase
=> "WHATDOIKNOW"
我的问题是:

String.methods的输出是什么类型的方法 为什么此输出中未列出.upcase方法 我怎样才能逐字列出字符串的所有方法,例如当我搜索某个东西时 String.methods是指String类上的方法;methods是指String类实例上的方法

事实上,您链接到的文档确实在Public Instance Methods标题下显示了upcase。

upcase方法是实例方法,而不是类方法

看看String.methods和String.methods之间的区别

你应该写:

String.instance_methods.include? :upcase
回顾的另一种方法是实例方法,这里的例子是字符串方法:注意符号和。象征

字符串有一个upcase方法。但String不是String,它是一个类,类没有upcase方法

如果您想知道特定字符串对象是否具有upcase方法,应询问该字符串:

'foo'.methods.include?(:upcase) # => true
或者,您应该询问String类是否为所有字符串定义了实例方法include:

String.instance_methods.include?(:upcase) # => true

记住:类和其他类一样都是对象。它们有方法、实例变量和类。

String.instance\u methods.include?:upcase==trueString.instance\u方法,您正在列出clss方法,这是一个很好的解释,但响应?:upcase几乎总是比方法更好的主意。包括?:upcase,因为某些类会根据需要创建方法,并有自定义的响应?说明这一点的实现。期望所有方法都显式列出是错误的。@tadman:是的,对象是否响应特定消息以及对象是否具有特定方法是两个不同的问题。通常,对象将通过调用与消息同名的方法来响应消息,但情况并非总是如此。OP询问的是方法,而不是消息,所以我回答的是方法。
String.new.method(:upcase) #=> #<Method: String#upcase>
String.method(:try_convert) #=> #<Method: String.try_convert>
'foo'.methods.include?(:upcase) # => true
String.instance_methods.include?(:upcase) # => true