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

推荐答案

更新:由于这个答案最近似乎引起了一些兴趣,我想指出有discussion on the Ruby issue tracker to remove the feature discussed here, namely to forbid having method definitions inside a method body个.


不,Ruby没有嵌套的方法.

你可以这样做:

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

Test1.new.meth1

但这是一种嵌套方法.我重复一遍:Ruby does not have嵌套方法.

这是一个动态的方法定义.当您运行meth1时,meth1的主体将被执行.正文恰好定义了一个名为meth2的方法,这就是为什么在运行meth1次之后,可以调用meth2.

meth2的定义在哪里?很明显,它被定义为嵌套方法,因为Ruby中有are no个嵌套方法.它被定义为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

简而言之:不,Ruby does not支持嵌套方法.

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


更新继续:那么,在later个阶段,这个语法可能会被重新用于向Ruby添加嵌套方法,其行为方式与我描述的相同:它们将被限定在其包含方法的范围内,即在其包含方法体之外是不可见和不可访问的.而且,它们可能可以访问其包含方法的词法范围.然而,如果你阅读了我上面链接的讨论,你会发现matz非常反对嵌套方法(但仍然支持删除嵌套方法定义).

Ruby相关问答推荐

如何使用Ruby range?

如何修复 '535-5.7.8 用户名和密码未被接受.在 Devise 邮件确认错误中了解更多信息?

如果嵌套数组为空,如何判断 ruby​​?

回声ABC | ruby -p -e "sub('a','A').sub('b', 'B')": 为什么不是 "ABc"?

查看 Savon 请求 XML 而不发送到服务器

如何使用 Ruby 删除字符串中某个字符后的子字符串?

each_with_index_do 从 1 开始索引

define_method:如何动态创建带参数的方法

哈希或其他对象的内存大小?

将 ruby​​ hash .default 设置为列表

Ruby数组中的`return`#map

模块中的实例变量?

确保如何在 ruby​​ 中工作

ruby 是否支持 case 语句中的范围?

class_eval <<-"end_eval", __FILE__, __LINE__ 在 Ruby 中是什么意思?

如何绘制 git repo 的代码行历史记录?

Broken pipe (Errno::EPIPE)

Ruby Koan 151 引发异常

判断字符串是否为空的Ruby方法?

Ruby NOT Rails 中有复数函数吗?