【问题标题】:Checking the Class of an Instance Method in IRB在 IRB 中检查实例方法的类
【发布时间】:2013-09-26 22:23:08
【问题描述】:

我是红宝石新手。

Irb 内的命令行中,我可以检查一个方法属于哪个类,例如:to_s(属于String 类):

但是,当我对添加方法 (which belongs to the ThreadGroup class) 执行相同操作时,它并没有告诉我类。这个我不明白。

谁能解释这是为什么?感谢您的任何提示。

注意:我已经编辑了我的to_s 屏幕截图以便澄清。

【问题讨论】:

  • 除非您显示代码生成的 GUI 的结果,否则不要使用屏幕截图。对于这个问题,您应该使用实际文本;将其复制并粘贴到问题中。这样,即使是该文本也可以被其他需要相同帮助的人搜索和找到。通过这样做,您可以让 Stack Overflow 对其他人更有用。
  • 谢谢@theTinMan .. 我没想到会这样。以后会做的。

标签: ruby class methods


【解决方案1】:

ThreadGroup#add 是类ThreadGroup实例方法,而不是实例。您可以在类的实例上调用Object#class,但不能在方法上调用。 Object 类没有任何名为 add 的方法,因此您遇到了一个合法错误。在顶层 self,即 main,是 Object 类的一个实例。

self.instance_of?(Object) # => true
self.respond_to?(:to_s) # => true
self.respond_to?(:add) # => false

to_s.class 有效,因为它实际上是self.to_s.class

to_s # => "main"
self.to_s # => "main"
to_s.class # => String

【讨论】:

  • 好的,所以一般只会返回属于Object类的类?我在最后一分钟测试了这个类的许多方法,这似乎证实了你所说的。
  • 不,如果您调用的方法返回某些内容,它将返回类。但是在 irb 中你只能调用对象中存在的方法。或者您在某个对象的实例上调用它:1.class #=> Fixnum"foo".class #=> String:foo.class #=> Symbol"foo".to_i.class => Fixnum...
【解决方案2】:

to_s.class 不返回String,因为它属于String 类。它返回String,因为to_s 返回String。如果你在 irb 中调用to_s,它会返回"main"String 是什么。

你不能直接在irb中调用add,因为Main对象没有响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多