当前位置:  开发笔记 > 编程语言 > 正文

String.methods.include?(:upcase)=> false但是'.upcase'列在ruby-doc.org

如何解决《String.methods.include?(:upcase)=>false但是'.upcase'列在ruby-doc.org》经验,为你挑选了2个好方法。

我一直在玩Strings(在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'未包含在输出中,我试图以这种方式接收它:

String.methods.include?(:upcase)
=> false                          # mother of god, I am shocked!

但是http://ruby-doc.org/core-2.0/String.html#method-i-upcase将.upcase方法列为Class String的方法.

当然,在我的irb-sessions或编辑中,ruby完全理解执行

"whatdoiknow".upcase
=> "WHATDOIKNOW"

我的问题是:

    String.methods的输出是什么类型的方法

    为什么.upcase方法未在此输出中列出

    我怎样才能真正列出String的所有方法(例如,当我搜索某些东西时)

Jörg W Mitta.. 10

字符串有一种upcase方法.但String它不是一个字符串,它是一个,并且类没有upcase方法.

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

'foo'.methods.include?(:upcase) # => true

或者你应该问String类是否include有为所有字符串定义的实例方法:

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

记住:类就像任何其他类一样是对象.他们有方法,他们有实例变量,他们有一个类.



1> Jörg W Mitta..:

字符串有一种upcase方法.但String它不是一个字符串,它是一个,并且类没有upcase方法.

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

'foo'.methods.include?(:upcase) # => true

或者你应该问String类是否include有为所有字符串定义的实例方法:

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

记住:类就像任何其他类一样是对象.他们有方法,他们有实例变量,他们有一个类.


这是一个很好的解释,但是`respond_to?(:upcase)`几乎总是比`methods.include更好的主意?(:upcase)`因为有些类会按需创建方法并且有一个自定义的`respond_to?`实现为了这.期望明确列出所有方法是错误的.

2> Mark Rushako..:

String.methods指的是String班上的方法; "foo".methods指的是类的实例上的方法String.

实际上,您链接到的文档确实显示upcase在"公共实例方法"标题下.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有