ruby - 为什么会.is_a?和 .class 给出相互矛盾的结果?

标签 ruby

我有三个属于同一个类的对象。一个是通过 Item.new 创建的,另外两个是从数据库 (Mongoid) 中提取的。我将这些对象中的一个/任何一个传递给另一个方法,并通过 is_a? 检查该方法中的类型:

def initialize (item, attrs = nil, options = nil)
  super(attrs, options)
  raise 'invalid item object' unless item.is_a?(Item)

好吧,这次加薪被击中了。所以我在 Rails 控制台中检查类、is_a 和 instance_of。我得到相互矛盾的结果。为什么它们有相同的 class 但只有其中一个是那个 classinstance_of

>> i0.is_a? Item
=> false
>> i1.is_a? Item
=> false
>> i2.is_a? Item
=> true

>> i0.class
=> Item
>> i1.class
=> Item
>> i2.class
=> Item

>> i0.instance_of?(Item)
=> false
>> i1.instance_of?(Item)
=> false
>> i2.instance_of?(Item)
=> true

是否有更好的方法来对我的输入进行这种类型检查?为什么同一个类的三个事物不都是该类的实例?

最佳答案

我不知道 Mongoid,但通常,在数据库访问库中,您不会从数据库中获取实际对象,而是作为存储在数据库中的对象的代理对象.由于 Ruby 缺乏实现完美透明代理的功能,您有时会看到奇怪的结果,尤其是在使用反射或围绕对象标识时。

关于ruby - 为什么会.is_a?和 .class 给出相互矛盾的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9163862/

相关文章:

ruby - 在 Ruby 中,一个绑定(bind)对象会携带一个 block ?

Ruby 类常量

ruby - 如何使用 capybara 和 ruby 重新加载页面直到出现按钮

ruby - 如何通过点击鞋子 ruby 中的按钮打开一个新窗口

ruby-on-rails - Rails 路由变量

ruby-on-rails - 使用给定对象在数据库中查找下一个 ActiveRecord 模型对象

ruby-on-rails - 重定向 Rails 3 中特定 Controller 的记录器输出

ruby-on-rails - 如果用户将答案留空,如何将变量设置为零?

sql - 在查询的选择中传递参数

ruby-on-rails - 测试属于 Rails 中帖子的评论的 Controller