ruby - 在 ruby​​ 上,为什么 include 是私有(private)的而 extend 是公共(public)的?

标签 ruby metaprogramming language-design access-specifier

在ruby上,为什么include是private,而Object#extend是public?

最佳答案

Object#extend 必须 是公开的,否则您将无法使用它。毕竟,它的目的是将模块混合到对象中,因此您通常会像 obj.extend(Foo) 那样调用它,这对于私有(private)方法是不可能的。

Module#include 通常只在模块体内使用,如下所示:

class Bar
  include Foo
end

即它通常在没有接收者的情况下被调用,所以它不必公开。当然,它也必须是私有(private)的。

我猜它之所以是私有(private)的是因为它更具侵入性,因为它改变了 Barevery 实例的行为,而 Object# extend 仅更改单个对象。因此,Module#include 在某种意义上“更危险”,因此被设为私有(private)。

我不知道这是否是真正的原因,但它与其他类似的方法如 Module#define_method 是一致的。

关于ruby - 在 ruby​​ 上,为什么 include 是私有(private)的而 extend 是公共(public)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4213837/

相关文章:

ruby - 使用 RSpec 测试 @current_user 方法

ruby-on-rails - 为 Mac 10.9/Rails 3.2.11 安装 therubyracer gem 时出错

ruby-on-rails - 自动创建缺失的连接模型

graphics - 我应该为粒子引擎可编写脚本的引擎设计什么样的语言?

ruby-on-rails - Ruby:在 block 后调用 'join'

ruby-on-rails - 用于操作现有 PDF 的 Ruby 库

r - {rlang }'s ' curly-curly'运算符 `{{`是如何实现的?

c++ - 使用元编程选择 int 类型会产生错误

c# - 编译器错误取决于方法签名中的参数位置。使用未分配的局部变量

math - 为什么模数以编程语言的方式定义