質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

受付中

Rubyのクロージャ

ivezuki
ivezuki

総合スコア33

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

1回答

0グッド

0クリップ

1956閲覧

投稿2015/01/18 16:32

lang

1def counter_closure 2 count = 0 3 lambda {|n| count += n } 4end 5 6p counter_closure.call(1) 7p counter_closure.call(2) 8p counter_closure.call(3) 9p counter_closure.call(4) 10p "---" 11counter = counter_closure 12p counter.call(1) 13p counter.call(2) 14p counter.call(3) 15p counter.call(4)

の実行結果が

lang

11 22 33 44 5"---" 61 73 86 910

となるのですが、どうしてこのような結果になるのか理解できていません。
特に、どうしてcounterだけクロージャになっているかがわかっていません。
解説をよろしくお願いします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

5

そのコードは下記と同じです。メソッド呼び出しの括弧が省略可能なためです。

lang

1def counter_closure 2 count = 0 3 lambda {|n| count += n } 4end 5 6p counter_closure().call(1) 7p counter_closure().call(2) 8p counter_closure().call(3) 9p counter_closure().call(4) 10p "---" 11counter = counter_closure() 12p counter.call(1) 13p counter.call(2) 14p counter.call(3) 15p counter.call(4)

前半の部分は、毎回 counter_closure() が実行されているので、毎回新しいクロージャーが返されます。count も各呼び出しごとに異なる変数です。

一方、後半の部分は counter_closure() は1回しか実行されていないので、同じクロージャーが使いまわされています。

投稿2015/01/19 00:22

ngyuki

総合スコア4510

hello-world, k.tada, maisumakun, katoy, otn👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。