1. ホーム
  2. ruby

[解決済み] Methodsの中にMethodsを持つことは可能ですか?

2023-02-11 03:25:33

質問

メソッドの中にメソッドがあります。内部のメソッドは実行されている変数ループに依存しています。それは悪い考えですか?

どのように解決するのですか?

UPDATE: この回答は最近興味を持たれているようなので、私が指摘したいことは に対する Ruby issue tracker での議論です。 を削除する ここで議論されている機能、すなわち を禁止する メソッド定義がメソッドボディの中にあること .


いいえ、Rubyにはネストされたメソッドはありません。

このようなことはできます。

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

Test1.new.meth1

しかし、それは ではない であり、ネストされたメソッドではありません。繰り返しますが、Ruby の には はネストされたメソッドを持ちません。

これは何かというと、動的なメソッド定義です。あなたが meth1 を実行すると、本文の meth1 が実行されます。このボディでは、たまたま meth2 を実行した後に meth1 を一度実行した後に meth2 .

しかし、どこに meth2 はどこで定義されているのでしょうか?まあ、それは明らかに ではなく があるので、ネストしたメソッドとして定義されていないことは明らかです。 は存在しないので は存在しないからです。のインスタンスメソッドとして定義されています。 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

要するに、NO, Ruby はそうではありません。 はネストされたメソッドをサポートしていません。

Rubyでは、メソッド本体はクロージャにできず、ブロック本体だけがクロージャにできることにも注意してください。これは、ネストされたメソッドの主要な使用例をほぼ排除しています。 もし Ruby がネストされたメソッドをサポートしていたとしても、ネストされたメソッドで外側のメソッドの変数を使用することはできないからです。


UPDATE CONTINUED: にて。 この構文は、Ruby にネストされたメソッドを追加するために再利用されるかも知れません。そして、場合によっては、そのメソッドのレキシカルスコープにアクセスできるかもしれない。しかし、私が上でリンクした議論を読めば、matz がネストされたメソッドに激しく反対していることがわかります (しかし、ネストされたメソッド定義を削除することには賛成です)。