一类在红宝石中的二级嵌套。

Amritesh
module M1
    class A
        def fun
            puts "module M1 class A method fun()"
        end
    end
end

module M2
    class A
        def fun
            puts "module M2 class A method fun()"
        end
    end
end

class MyClass
    include M1
    include M2
end

obj1 = MyClass::M1::A.new
puts obj1.class
puts obj1.object_id
obj1.fun

obj2 = MyClass::M2::A.new
puts obj2.class
puts obj2.object_id
obj2.fun

输出为

r20.rb:22: warning: toplevel constant M1 referenced by MyClass::M1
M1::A
13996360
module M1 class A method fun()
r20.rb:27: warning: toplevel constant M2 referenced by MyClass::M2
M2::A
13996120
module M2 class A method fun()

我不明白为什么会出现此警告消息。请解释一下。如果有这种必要性,以这种方式进行嵌套是否不好?

还有一个问题是,当我在两个对象(即Obj1和Obj2)上调用超类方法时,不会出现方法错误,不知道为什么,我的意思是毕竟它们也是对象,为什么它们没有超对象的所有对象有。

阿列克谢·马蒂什金(Alexei Matiushkin)

实际上,ruby会打印出足够多的消息以供理解,这是怎么回事。

首先,这是重新编写代码以不产生警告的方式:

- obj1 = MyClass::M1::A.new
+ obj1 = M1::A.new

这可能不是您想要的,但这是您指示ruby要做的。

为什么?

这很简单。模块和类名是ruby中的常量。经过

include M1

几乎行内(不完全,但不同的是出于对这个问题的范围)内容M1插入MyClass

M1内联的内容之后,可以通过以下方式引用它

MyClass::M1

可是等等!M1常量已经在Object(顶层)上定义默认情况下MyClass它是从Objectruby中其他任何用户生成的类派生的尝试引用常量(Object::M1因为它属于MyClass名称空间)会产生警告。

创造了什么?

MyClass::M1::A实际上是不正确的,但工作代名词M1::AMyClass::A重新定义由第二include那么你:

  • 实例化了两个不同的类,M1::A并且M2::A与之无关MyClass
  • 让自己纠缠不清,可能假设您现在拥有MyClass命名空间的类M1::AM2::A
  • 实际上有一个 MyClass::A类,其fun功能来自M2,因为MyClass::A该类是打开的(请参见“ ruby中打开的类”),并且MyClass::A#fun定义由第二个include语句进行了猴子修补

怎么GTD?

由于include实际上是内联内容,因此这是您可以实现可能想要实现的行为的方式:

module MM
  module M1
    class A
        def fun ; puts "module M1 class A method fun()" ; end
    end 
  end 

  module M2
    class A
        def fun ; puts "module M2 class A method fun()" ; end
    end 
  end 
end

class MyClass
    include MM
end

obj1 = MyClass::M1::A.new
puts obj1.class
puts obj1.object_id
obj1.fun

obj2 = MyClass::M2::A.new
puts obj2.class
puts obj2.object_id
obj2.fun

#⇒ MM::M1::A
#⇒ 100355060
#⇒ module M1 class A method fun()
#⇒ MM::M2::A
#⇒ 100354990
#⇒ module M2 class A method fun()

希望能帮助到你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

红宝石中的嵌套作业

来自分类Dev

android中的第二级回调不适用于嵌套查询

来自分类Dev

红宝石中的类后代语法

来自分类Dev

红宝石中的类后代语法

来自分类Dev

DynamoDB中的可选二级索引

来自分类Dev

DynamoDB中的可选二级索引

来自分类Dev

SQL中的二级分组

来自分类Dev

CheckedListBox中的第二级

来自分类Dev

如何在另一个类的红宝石中隐藏一个类

来自分类Dev

在kotlin类中创建二级构造函数的正确位置是什么?

来自分类Dev

如何在嵌套CC的层次结构中访问第二级父级复合组件?

来自分类Dev

如何使用嵌套资源检索用户二级资源

来自分类Dev

在Ruby中从第二级调用第二级函数

来自分类Dev

如何在mysql中声明二级或非唯一索引?

来自分类Dev

DynamoDB中的全局二级索引是否需要唯一?

来自分类Dev

红宝石升级后,超类必须是rspec中的类

来自分类Dev

处理红宝石中嵌套条件的最佳方法是什么?

来自分类Dev

红宝石嵌套数组中哈希键的总和

来自分类Dev

替换嵌套数组红宝石中的元素

来自分类Dev

如何获取红宝石中复杂的嵌套哈希的元素?

来自分类Dev

处理红宝石中嵌套条件的最佳方法是什么?

来自分类Dev

红宝石嵌套数组中哈希键的总和

来自分类Dev

如何在laravel中通过hasMAny的第一级获取第二级hasMany关系

来自分类Dev

如果第二级父级不存在,则给子级元素类

来自分类Dev

DynamoDB二级索引的唯一性

来自分类Dev

DynamoDB一致读取全局二级索引

来自分类Dev

当我为游戏的第二级实现不同的类时,如何修复 Jlabel 中消失的单词?

来自分类Dev

类中的红宝石常量作用域<<自我阻止

来自分类Dev

红宝石本征类中的模块包含

Related 相关文章

热门标签

归档