Ruby:kind_of?与instance_of?与is_a?

Cla*_*diu 470 ruby inheritance introspection

有什么不同?我什么时候应该使用哪个?为什么会有这么多?

sep*_*p2k 602

kind_of?并且is_a?是同义词.instance_of?与其他两个不同之处在于,只有true当对象是该确切类的实例而不是子类时,它才会返回.

示例:"hello".is_a? Object"hello".kind_of? Object返回true因为"hello"是a String并且String是其子类Object.然而"hello".instance_of? Object回报false.

  • 它有时读得更好.想想`@honda.kind_of?汽车`和`@ person.is_a?管理员`,Ruby是关于美学的.事实上,请注意语法错误......有了积极的支持,你可以写一下`@ person.is_an?管理员`:))实际上,这可能已经成为Ruby核心. (74认同)
  • @Matt:您可以覆盖别名而不覆盖别名函数.所以是的,你可以覆盖`kind_of?`而不覆盖`is_a?`. (9认同)
  • 这个ActiceSupport在哪里?is_an?`方法?!它不在当前的rails版本中,我在谷歌上找不到任何关于它被弃用的东西. (4认同)
  • @thenduks,`is_an?`不在ruby-1.9.2-p0.@Claudiu,没有.[`is_a?`只是`kind_of的一个别名?`](https://github.com/ruby/ruby/blob/trunk/object.c#L2582).两种方法都调用相同的c函数,[`rb_obj_is_kind_of`](https://github.com/ruby/ruby/blob/trunk/object.c#L471). (3认同)
  • 嘿,这是一个有趣的原因.你可以打破这个吗?你可以覆盖`kind_of?`而不是`is_a?`? (2认同)

Jör*_*tag 21

有什么不同?

从文档:

- (布尔)instance_of?(class)
返回trueif obj是给定类的实例.

和:

- (布尔)is_a?(class)
- (布尔)kind_of?(class)
返回trueif class是类的类obj,或者是否classobj包含在其中的超类或模块之一obj.

如果不清楚,最好知道究竟是什么不清楚,以便可以改进文档.

我什么时候应该使用哪个?

决不.请改用多态.

为什么会有这么多?

我不打电话给两个 "很多".有两个,因为他们做了两件不同的事情.

  • 多态性是什么意思?它和鸭子打字一样吗? (4认同)
  • 我认为我的困惑是有3个,而且2只是做同样的事情并且有不同的名字.关于使用多态 - 我同意,但ruby标准库充满了这些中的每一个 (3认同)
  • 做多态性通常更好,是的,但是有边界情况你真的想知道你有一个特定的类,比如你处理文件时. (3认同)
  • 是的,他们是一样的.鸭子打字是一种多态性. (2认同)

小智 6

使用时,询问对象是否响应您需要或不需要的方法更像Ruby respond_to?.这允许最小的接口和实现不知道的编程.

当然,它并不总是适用,因此仍然有可能使用您所询问的方法询问对"类型"(类或基类)的更保守的理解.

  • 这取决于情况.Comment和Blog都可以响应created_at.在这种情况下is_a?更合适恕我直言 (5认同)

Bor*_*cky 5

我也不会调用两个 Many (is_a?kind_of?是同一方法的别名),但如果您想看到更多可能性,请将注意力转向#class方法:

A = Class.new
B = Class.new A

a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class
Run Code Online (Sandbox Code Playgroud)