gpt4 book ai didi

ruby - ruby 类的两级嵌套。

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:19 31 4
gpt4 key购买 nike

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)上调用父类(super class)方法时,没有出现方法错误,不知道为什么,我的意思是毕竟它们也是对象,为什么它们没有父类(super class)方法所有对象都有。

最佳答案

实际上,ruby 会打印足够多的消息来理解发生了什么。

首先,这是如何重写您的代码以获得没有警告的方式:

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

这可能不是您想要的,但这是您指示 ruby​​ 执行的操作。

为什么?

很简单。模块和类名在 ruby​​ 中是常量。通过

include M1

几乎内联(不完全是,但差异超出了这个问题的范围)内容 M1 到您的 MyClass

内联M1的内容后,通过

引用它
MyClass::M1

但是等等! M1 常量已在 Object(顶级)上定义。并且 MyClass 默认情况下从 Object 派生,就像 ruby​​ 中任何其他用户生成的类一样。尝试引用属于 MyClass 命名空间的常量 Object::M1 会产生警告。

创建了什么?

MyClass::M1::A 实际上是 M1::A 的一个不正确但有效的同义词。 MyClass::A 被第二个 include 重新定义。所以,你:

  • 实例化了两个不同的类 M1::AM2::A,它们都与 MyClass无关;
  • 让自己陷入困境,可能假设您现在有 MyClass 命名空间类 M1::AM2::A
  • 实际上有 一个 MyClass::A 类,具有来自 M2 的 fun 函数,因为 MyClass::A 类已打开(参见“opened classes in ruby”)并且 MyClass::A#fun 定义是 monkeypatched 通过第二个包含语句。

如何做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()

希望对您有所帮助。

关于ruby - ruby 类的两级嵌套。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29961257/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com