【问题标题】:Ruby: how to determine an object type in irb and binding.pry?Ruby:如何确定 irb 和 binding.pry 中的对象类型?
【发布时间】:2017-02-11 16:50:22
【问题描述】:

我刚刚开始在我的对象之后添加 binding.pry,以便开始确定它们的评估结果。但是,现在我想知道输出是什么类型的对象。

如何在 irb 中做到这一点?如何在 binding.pry 中执行此操作?

编辑: 这是我试图确定对象 H 的类型。我知道它是一个哈希,但有时在控制台中不太明显:

irb(main):001:0> H = Hash["a" => 100, "b" => 200]
=> {"a"=>100, "b"=>200}
irb(main):002:0> H
=> {"a"=>100, "b"=>200}
irb(main):003:0> type(H)
NoMethodError: undefined method `type' for main:Object
    from (irb):3
    from /Users/macbook/.rbenv/versions/2.3.0/bin/irb:11:in `<main>'
irb(main):004:0> object.class(H)
NameError: undefined local variable or method `object' for main:Object
Did you mean?  object_id
    from (irb):4
    from /Users/macbook/.rbenv/versions/2.3.0/bin/irb:11:in `<main>'
irb(main):005:0> object.is_a?(H)
NameError: undefined local variable or method `object' for main:Object
Did you mean?  object_id
    from (irb):5
    from /Users/macbook/.rbenv/versions/2.3.0/bin/irb:11:in `<main>'

【问题讨论】:

    标签: ruby irb pry


    【解决方案1】:

    您可以通过

    获取class
    h = {a: 100, b: 200}
    h.class
    
    # Hash
    

    您还可以检查某物是否属于特定类别

    h.is_a? Hash
    # true
    
    h.is_a? String
    # false
    

    【讨论】:

    • 非常感谢!额外的一点对学习很有帮助。
    • class Foo &lt; Hash; end Foo.new.is_a? Hash #=> true。道德:check if something is of a particular class 一个应该使用instance_of? :)
    • @AndreyDeineko 但这也向您展示了 Foo 响应 Hash 方法,因此它并非都是无用的。你也可以说 Foo &lt; Hash 来检查 Foo 是否继承自 Hash。
    • @maxple 从未暗示 is_a? 没用。只是想强调一下,如果要严格检查对象的类型,只有instance_of 会这样做,而kind_of?is_a? 不会:)
    • 这不显示类型,它显示了类,这是完全不同的东西。
    【解决方案2】:

    Ruby 语言没有“类型”的概念。或者,更准确地说:在 Ruby 中,类型只是潜在地存在于程序员的脑海中,它们不会在程序中体现出来。所以,没有办法从程序中获取对象的类型,只能从程序员那里获取。

    有时,类型会记录在文档或 cmets 中。有些类型基本上是社区民间传说,没有写在任何地方,而是代代相传。

    你可以问一个对象的class,你可以问它的methods,你可以问它whether it responds to a specific message,但你不能问它的类型。

    请注意,旧版本的 Ruby 有一个 type,但该方法被删除了,因为它具有误导性:它实际上并没有返回类型(我在上面解释了为什么这是不可能的),它返回了 class,这是完全不同的东西。

    【讨论】:

    • 有趣,所以解释了这个回复pry(#&lt;Integrations::YoutubeController&gt;)&gt; daily_youtube_stats.class =&gt; IntegrationStatistic(id: integer, credentials_id: integer, followers_count: integer, follows_count: integer, views_count: integer, likes_count: integer, dislikes_count: integer, comments_count: integer, shares_count: integer, media_count: integer, created_at: datetime, updated_at: datetime, user_id: integer, integration_id: integer)
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 2016-06-04
    • 2016-09-06
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多