0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

関数の中に関数を定義する

Posted at

Rubyのバージョン 2.6.5

目次

  • 関数の中に関数を定義する方法
  • 関数の上書き
  • まとめ
  • 今回の気づき

関数の中に関数を定義する方法

以下のようにして関数の中に関数を定義します。

ruby
def a
  def b
    puts "b"
  end
end

ここで、関数bをよびだすと以下のようなエラーが起こります。

def a
  def b
    puts "b"
  end
end

b  #関数を呼び出す

↓↓↓↓↓ターミナル

Traceback (most recent call last):
test.rb:7:in `<main>': undefined local variable or method `b' for main:Object (NameError)

bという関数が定義されていないようです。
b関数を定義するには、最初にa関数を呼び出しておく必要があります。

def a
  def b
    puts "b"
  end
end

a  #初めにa関数を呼び出しておく→ここでb関数が定義される
b  #関数を呼び出す

↓↓↓↓↓ターミナル

b

関数の上書き

クラスに定義されているインスタンスメソッドの上書きはオーバーライドというらしい。
以下のようにして上書きすることができる。

ruby
def a
  puts "abc"
end

a  #a関数を呼び出す

def a
  puts "123"
end

a  #a関数を呼び出す

↓↓↓↓↓ターミナル

abc
123

a関数やc関数を呼び出すたびにb関数を上書きしてみる。

ruby
def a
  def b
    puts "abc"
  end
end

def c
  def b
    puts "123"
  end
end

a  #a関数を呼び出す→b関数が定義される
b  #b関数を呼び出す
c  #c関数を呼び出す→b関数が上書きされる
b  #b関数を呼び出す
a  #a関数を呼び出す→b関数が上書きされる
b  #b関数を呼び出す

↓↓↓↓↓ターミナル

abc
123
abc

Rubyはオブジェクト指向のプログラミング言語です。なので、オーバーライド以外に使い道がないような気もしますが、オーバーライドはとても重要な要素なので覚えていて損はないと思います。

まとめ

関数の中に関数を定義することができます。使い道はよくわかりません。ので、できることだけ頭に入れておけばいいと思います。やり方はその都度調べればいいと思います。

今回の気づき

関数の中に関数を定義するという、使うタイミングがわからないものを紹介したこともあり、深い話ができなかった。実装に悩んで、調べて解決したものを載せる方がいいかもしれない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?