🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

解決済

1回答

894閲覧

Ruby |  Procインスタンスが値を保持している挙動がわからない

yo_instead_what

総合スコア5

Ruby

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

0グッド

1クリップ

投稿2019/11/23 07:27

勉強不足ですみません。
自分の頭ではどうしても理解ができなかったので質問させていただきます。。。

わからないこと

なぜこのProcのインスタンスが値を保持して、callするたびにインクリメントできているのかわかりません

ruby

1def get_counter(start) 2 Proc.new{|n| start += n } 3end 4 5count_up = get_counter(1) 6count_up.call(1) #=> 2 7count_up.call(1) #=> 3 8count_up.call(1) #=> 4

考えたこと

(1)

ruby

1count_up = get_counter(1) 2 3# このとき変数count_upに代入されるProcのインスタンスは、以下と考えました 4Proc.new{|n| 1 += n } 5# 1 = 1 + n っておかしくない...? 6 7# Procで実行されたことは保持されるのではないかと考え、試したこと 8count_up = Proc.new{|n| 1 + n } 9count_up.call(1) # => 2 10count_up.call(1) # => 2

(2) これだったら意味がわかる...

ruby

1start = 1 2count_up = Proc.new{|n| start += n } 3 4count_up.call(1) # => 2 5count_up.call(1) # => 3 6

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(1)

「定数の1」と、「初期値が1の変数」は異なります。

(2)

はい。それと同じ仕組みです。

投稿2019/11/23 07:32

otn

総合スコア85888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yo_instead_what

2019/11/23 08:02 編集

早速のご回答ありがとうございます!とても感謝します。 > 「定数の1」と、「初期値が1の変数」は異なります。 get_counter(1)としたとき、すでにProc.newにstartの値として入るものだと考えてしまいました。 ふと思い、pryを入れて挙動を確かめたところ納得できました。(最初からやれよという話ですが、、) つまり、こう言う認識であっていますでしょうか? ```ruby def get_counter(start) start = start Proc.new{|n| start += n} end ``` この場合、なぜstart = start を省略できるのか、コンテクストみたいなものもご教示いただけたら幸いです。 いずれにせよベストアンサーとさせていただきます。 ありがとうございました!
otn

2019/11/23 08:32

そもそも、仮引数(def get_counter(start) の start )は、実引数で初期化されたローカル変数です。 def foo(x) y = nil p local_variables end foo(10)
yo_instead_what

2019/11/23 09:00

> そもそも、仮引数(def get_counter(start) の start )は、実引数で初期化されたローカル変数です。 とってもメイクセンスです。。!! 仮引数に対する理解が深まりました。。 また、Kernel.#local_variablesも教えていただきありがとうございます!!m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問