方法里面可以有方法吗?

2023-11-26

我有一个方法里面有一个方法。内部方法取决于正在运行的变量循环。这是一个坏主意吗?


更新:由于这个答案最近似乎引起了一些兴趣,我想指出的是关于 Ruby 问题跟踪器的讨论remove这里讨论的功能,即forbid在方法体中包含方法定义.


不,Ruby 没有嵌套方法。

你可以这样做:

class Test1
  def meth1
    def meth2
      puts "Yay"
    end
    meth2
  end
end

Test1.new.meth1

但那就是not嵌套方法。我再说一遍:红宝石不具有嵌套方法。

这是一个动态方法定义。当你跑步时meth1,身体meth1将被执行。主体恰好定义了一个名为meth2,这就是为什么运行后meth1一次,你可以打电话meth2.

但在哪里meth2定义?嗯,很明显not定义为嵌套方法,因为有are noRuby 中的嵌套方法。它被定义为实例方法Test1:

Test1.new.meth2
# Yay

而且,它显然会在每次运行时被重新定义meth1:

Test1.new.meth1
# Yay

Test1.new.meth1
# test1.rb:3: warning: method redefined; discarding old meth2
# test1.rb:3: warning: previous definition of meth2 was here
# Yay

简而言之:不,鲁比does not支持嵌套方法。

另请注意,在 Ruby 中,方法体不能是闭包,只有块体可以。这几乎消除了嵌套方法的主要用例,因为即使ifRuby 支持嵌套方法,您不能在嵌套方法中使用外部方法的变量。


继续更新:later那么,这个语法可能会被重新用于向 Ruby 添加嵌套方法,这将按照我所描述的方式运行:它们的作用域将限于其包含方法,即在其包含方法主体之外不可见且不可访问。并且可能,他们可以访问其包含方法的词法范围。但是,如果您阅读我上面链接的讨论,您可以观察到 matz 强烈反对嵌套方法(但仍然删除嵌套方法定义)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

方法里面可以有方法吗? 的相关文章

随机推荐

  • 什么是 CPU 寄存器以及它们如何使用,特别是 WRT 多线程?

    这个问题和我下面的回答主要是针对另一个问题中的一个困惑的地方 在答案的最后 有一些我并不完全有信心的 WRT 易失性 和线程同步问题 我欢迎评论和替代答案 然而 问题的重点主要涉及 CPU 寄存器及其使用方式 寄存器是 CPU 中的 工作存
  • 如何在codeigniter 3.0中实现HMVC?

    目前我正在使用codeigniter3 0版本 我想知道如何在其中实现 HMVC 结构 有人可以帮忙吗 codeigniter 3 hmvc 模块文件夹用于 https bitbucket org wiredesignz codeignit
  • 用鼠标在画布上画线:Java awt

    尝试是在 awt canvas 上使用鼠标绘制图形 现在是一条线 我是第一次尝试java图形 所以不知道该怎么做 这是我的第一次尝试 package def grafi import java awt Canvas import java
  • 从多个不同的 Rails 模型创建“提要”

    我正在开发一个具有几种不同模型 票证 帖子 报告等 的应用程序 每个模型中的数据都不同 我想从所有这些模型创建一个 提要 全面显示 10 个最新条目 所有数据的混合 解决这个问题的最佳方法是什么 当为用户分配票证或发布新报告时 我是否应该创
  • 在 Perl 中如何判断变量是否具有数值?

    Perl 中有没有一种简单的方法可以让我确定给定变量是否是数字 大致如下 if is number x 将是理想的 一种不会在以下情况下发出警告的技术 w正在使用的开关当然是首选 Use Scalar Util looks like num
  • 如何在命令行中运行/调试 javascript

    我想知道 实际上我知道肯定有这样一种在命令行中运行js的方法 因为当我观看google I 0演示时 他们使用像d8这样的命令 也许它是V8引擎的一部分 有什么方法可以在命令行中运行 调试我的 JavaScript 例如d8 myJsfil
  • 如何在 iPhone 的 MKMapView 中显示带点(圆圈)的蓝色图钉

    我的问题可能看起来有点复杂 但让我澄清一下 我正在使用 mkmapview 在这里我想用蓝点和圆圈显示当前用户位置 但这并不是我想要的 当我正在制作一个 iPhone 应用程序时 由于我是地图集成的新手 因此我很难做到同样的事情 如果有人可
  • 从数据框列表中合并数据框[重复]

    这个问题在这里已经有答案了 我有一个数据框列表 如下所示 ls 1 1 month year oracle 1 2004 356 0000 2 2004 390 0000 3 2004 394 4286 4 2004 391 8571 ls
  • 溢出换行和断字之间的区别?

    之间的确切区别是什么overflow wrap word wrap and word break 谁能告诉我打破很长链接的更好方法是什么 大多数人说你应该将分词与overflow wrap但这看起来不太合逻辑 我认为使用overflow w
  • 随机排列数组 swift 3

    我怎样才能将下面的函数转换为swift 3 目前正在获取一个Binary operator lt cannot be applied to operands of type Int and Self IndexDistance error
  • 修改核心数据模型后重新创建类定义的更好方法?

    在 XCode 中设计核心数据模型时 可以通过以下方式自动生成 NSManagedObject 子类定义 m 和 h 文件 选择Entities 选择 创建 NSManagedObject 子类 EDITOR menu 之后 您可能会在这些
  • 你能使用 WINDOWS 构建一个 React-native iOS 应用程序吗?

    您可以在 Windows 上使用 React Native 构建 iOS 吗 还是需要xcode 如果是这样 有什么解决方法吗 我不想在 Mac 或 Mac 虚拟机上工作 我认为你用react native创建的应用程序可以在iOS上运行
  • 如何将 Docker 容器配置为可以通过容器 IP:端口从主机外部访问?

    我的主机有多个 IP 地址分配给一个网络接口 我想配置 Docker 以便让每个容器 响应 分配给主机的这些 IP 地址中的单个 IP 这可以通过 libcontainer 完成还是我必须使用 LXC 驱动程序并使用以下命令运行我的容器 l
  • 在响应完成之前关闭 HttpURLConnection

    背景 我在用着HttpURLConnection在客户端上使用 HTTP 流 服务器推送 情况下的响应 尽管服务器可以通过关闭响应来关闭连接 但客户端也需要能够执行此操作 Problem 客户端处理InputStream在一个单独的线程中
  • Shell:在多个文件中查找匹配行

    我正在尝试使用 shell 脚本 以及 oneliner 来查找大约 50 个文件之间的任何公共行 Edit 注意我正在寻找出现在所有文件中的一行 行 到目前为止我已经尝试过 grepgrep v x f file1 sp 它只匹配所有其他
  • 编译器强制我实现特征方法,但方法上绑定的“Self”特征永远不会满足我的类型

    我有一个特质Foo 我想强迫实现者定义一个方法 if这些实现者实现了另一个特征 Clone在此示例中 我的想法 操场 trait Foo Note in my real application the trait has other met
  • 导入 Access .mdb 时 SQL Server 导入向导“工作组信息文件”错误

    是否可以导入 MS Access 如果我没有安装 MS Access 如何将 mdb 文件导入 SQLExpress 我问的原因是因为我在尝试使用 SQL Management Studio 中的导入向导执行此任务时收到以下错误 由于初始化
  • PHP 8.2 动态属性已弃用:如何以兼容的方式使用它们

    在 PHP 8 2 中 动态属性已弃用 并且从 PHP 9 开始将导致致命错误 Using 动态属性 on Classes运行 PHP 8 2 将导致PHP Deprecated Creation of dynamic property i
  • matplotlib 动画绘图不会使用 blit 更新轴上的标签

    我正在使用 wxPython 在图中绘制数据 其中 y 轴上的数据限制随着数据而变化 我想动态更改轴而不重新绘制整个画布 例如canvas draw 相反我想用blitting为此 就像我为情节本身所做的那样 我要做的是改变 y 轴 并且我
  • 方法里面可以有方法吗?

    我有一个方法里面有一个方法 内部方法取决于正在运行的变量循环 这是一个坏主意吗 更新 由于这个答案最近似乎引起了一些兴趣 我想指出的是关于 Ruby 问题跟踪器的讨论remove这里讨论的功能 即forbid在方法体中包含方法定义 不 Ru