我有一个方法里面有一个方法。内部方法取决于正在运行的变量循环。这是一个坏主意吗?
更新:由于这个答案最近似乎引起了一些兴趣,我想指出的是关于 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(使用前将#替换为@)