如何探究Ruby模块的具体行为表现?

更新于
2026-10-09 21:20:30
1阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计404个文字,预计阅读时间需要2分钟。

如何探究Ruby模块的具体行为表现?

我刚开始学习编写Ruby代码,虽然我理解模块是如何工作的,但以下代码让我感到困惑:

rubymodule ModuleA def a_greet 'Hello from module A' endend

module ModuleB def b_greet 'Hello from module B' endend

include ModuleA

这段代码展示了如何定义两个模块`ModuleA`和`ModuleB`,并在`ModuleA`中定义了一个方法`a_greet`。然后,代码尝试将`ModuleA`包含进来,但没有包含`ModuleB`,也没有调用任何方法。因此,没有输出任何信息。如果想要看到输出,需要在包含模块后调用其中一个方法,例如:

rubyinclude ModuleAputs a_greet

所以我刚刚开始编写一些 Ruby,虽然我理解模块是如何工作的,但以下行为仍然让我失望.

module ModuleA def a_greet 'Hello from module A' end end module ModuleB def b_greet 'Hello from module B' end end include ModuleA include ModuleB # WHY DOES THIS WORK !!!!! p ModuleA.b_greet

我知道可以在不指定Module的情况下调用模块中的函数.并且我永远不会以这种方式编写代码,但我无法理解为什么在明确说明ModuleA时可以调用ModuleB中包含的方法?

等等,还有更多:

如何探究Ruby模块的具体行为表现?

"Why does this work?".b_greet # => "Hello from module B"

您将这些模块包含在顶级对象main中.它是一个特殊的对象:它上面定义的所有方法都可用于所有对象(参见上面的行,现在在String上有b_greet方法). ModuleA也是一个对象,因此,当您包含ModuleB时,ModuleA会获取其方法.如果将这些模块包含在常规类/对象中,则不会获得此“共享”行为.

本文共计404个文字,预计阅读时间需要2分钟。

如何探究Ruby模块的具体行为表现?

我刚开始学习编写Ruby代码,虽然我理解模块是如何工作的,但以下代码让我感到困惑:

rubymodule ModuleA def a_greet 'Hello from module A' endend

module ModuleB def b_greet 'Hello from module B' endend

include ModuleA

这段代码展示了如何定义两个模块`ModuleA`和`ModuleB`,并在`ModuleA`中定义了一个方法`a_greet`。然后,代码尝试将`ModuleA`包含进来,但没有包含`ModuleB`,也没有调用任何方法。因此,没有输出任何信息。如果想要看到输出,需要在包含模块后调用其中一个方法,例如:

rubyinclude ModuleAputs a_greet

所以我刚刚开始编写一些 Ruby,虽然我理解模块是如何工作的,但以下行为仍然让我失望.

module ModuleA def a_greet 'Hello from module A' end end module ModuleB def b_greet 'Hello from module B' end end include ModuleA include ModuleB # WHY DOES THIS WORK !!!!! p ModuleA.b_greet

我知道可以在不指定Module的情况下调用模块中的函数.并且我永远不会以这种方式编写代码,但我无法理解为什么在明确说明ModuleA时可以调用ModuleB中包含的方法?

等等,还有更多:

如何探究Ruby模块的具体行为表现?

"Why does this work?".b_greet # => "Hello from module B"

您将这些模块包含在顶级对象main中.它是一个特殊的对象:它上面定义的所有方法都可用于所有对象(参见上面的行,现在在String上有b_greet方法). ModuleA也是一个对象,因此,当您包含ModuleB时,ModuleA会获取其方法.如果将这些模块包含在常规类/对象中,则不会获得此“共享”行为.