13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

甚 至 你 只 是 声 明 了 这 些 子 过 程 而 并 没 有 定 义 它 们 , 系 统 也 会 认 为 它 是 真 实 的 。 它 们 在 一 个UNIVERSAL::can 检 查 里 出 现 , 而 且 更 重 要 的 是 , 它 们 在 搜 索 方 法 的 第 二 步 出 现 , 这 样 就永 远 不 会 进 行 第 三 步 , 更 不 用 说 第 四 步 了 。“ 不 过 ,” 你 可 能 会 说 ,“ 它 们 调 用 了 AUTOLOAD, 不 是 吗 ?” 的 确 , 它 们 最 终 调 用 了AUTOLOAD, 但 是 机 制 是 不 一 样 的 。 一 旦 通 过 第 二 步 找 到 了 方 法 存 根 (stub),<strong>Perl</strong> 就 会试 图 调 用 它 。 当 最 后 发 现 该 方 法 不 是 想 要 的 方 法 时 , 则 再 次 进 行 AUTOLOAD 搜 索 , 不 过这 回 它 从 包 含 存 根 的 类 开 始 搜 索 , 这 样 就 把 方 法 的 搜 索 限 制 在 该 类 和 该 类 的 祖 先 ( 以 及UNIVSRSAL) 中 。 这 就 是 <strong>Perl</strong> 如 何 查 找 正 确 的 AUTOLOAD 来 运 行 和 如 何 忽 略 来 自 最初 的 继 承 树 中 错 误 的 AUTOLOAD 部 分 的 方 法 。12.5.5 私 有 方 法有 一 个 调 用 方 法 的 手 段 可 以 完 全 令 <strong>Perl</strong> 忽 略 继 承 。 如 果 用 的 不 是 一 个 文 本 方 法 名 , 而 是 一个 简 单 的 标 量 变 量 , 该 变 量 包 含 一 个 指 向 一 个 子 过 程 的 引 用 , 则 立 即 调 用 该 子 过 程 。 在 前 一节 的 UNIVERSAL->can 的 描 述 中 , 最 后 一 个 例 子 使 用 子 过 程 的 引 用 而 不 是 其 名 字 调 用 所有 被 覆 盖 了 的 方 法 。这 个 特 性 的 一 个 非 常 诱 人 的 方 面 是 他 可 以 用 于 实 现 私 有 方 法 调 用 。 如 果 把 你 的 类 放 在 一 个 模块 里 , 你 可 以 利 用 文 件 的 词 法 范 围 为 私 有 性 服 务 。 首 先 , 把 一 个 匿 名 子 过 程 存 放 在 一 个 文 件范 围 的 词 法 里 :# 声 明 私 有 方 法my $secret_door = sub {my $self = shift;...};然 后 在 这 个 文 件 里 , 你 可 以 把 那 个 变 量 当 作 保 存 有 一 个 方 法 名 这 样 来 使 用 。 这 个 闭 合 将 会 被直 接 调 用 , 而 不 用 考 虑 继 承 。 和 任 何 其 他 方 法 一 样 , 调 用 者 作 为 一 个 额 外 的 参 数 传 递 进 去 。sub knock {my $self = shift;if ($self->{knocked}++ > 5) {$self->$secret_door();308

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!