【问题标题】:How do I check if a variable is an instance of a class?如何检查变量是否是类的实例?
【发布时间】:2011-03-26 09:13:16
【问题描述】:

在 Java 中,您可以使用instanceof。是否有 Ruby 等价物?

【问题讨论】:

    标签: ruby inheritance introspection


    【解决方案1】:

    几乎完全一样。可以使用Objectinstance_of?方法:

    "a".instance_of? String # => true
    "a".instance_of? Object # => false
    

    Ruby 也有 is_a?kind_of? 方法(这两个是别名,工作方式完全相同),它们返回 true 是匹配超类之一:

    "a".is_a? String # => true
    "a".is_a? Object # => true
    

    【讨论】:

    • 注:据我所知,如果 self 是参数的子类的实例,则返回 false。
    【解决方案2】:

    kind_of?is_a? 是同义词。它们相当于 Ruby 的 instanceof

    instance_of? 的不同之处在于它只返回 true 如果对象是该确切类的实例,而不是子类。

    【讨论】:

      【解决方案3】:

      查看instance_of?kind_of? 方法。这是文档链接http://ruby-doc.org/core/classes/Object.html#M000372

      【讨论】:

        【解决方案4】:

        我在klass 上取得了成功,它返回了类对象。这似乎是特定于 Rails 的。

        示例用法:

        class Foo
        end
        
        Foo.new.klass
        # => Foo
        
        Foo.new.klass == Foo
        # => true
        
        Foo.new.klass == "Foo"
        # => false
        

        还有一个方法可以做到这一点:Object.is_a?,它将类对象作为参数,如果 self 是类的实例或子类的实例,则返回 true。

        【讨论】:

        • 我希望我能选择两个正确的答案。 Array 没有 klass 作为方法,但它确实有 instance_of 但 active_record abjects 确实有 .klass,我认为。
        • Array.class 应该也能正常工作。我的回答搞混了,因为我使用的库扩展了类Object 和方法class
        • my_instance.klass 不起作用,至少在 2020 年不起作用,不管有没有 Rails。 my_instance.class 是获取对象类的正确方法。
        【解决方案5】:

        为完整性添加另一个答案。有时,特别是在测试期间,我们可能不想按类型访问另一个类,所以给定一个 Hash:

        h = { one: 'Val 1' }
        

        而不是写:

        h.is_a? Hash # true
        

        我们可以写:

        h.class.name == 'Hash' # true
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-28
          • 2018-11-26
          • 2017-02-25
          • 2019-01-08
          • 1970-01-01
          • 2020-01-30
          相关资源
          最近更新 更多