回答編集履歴
3
加筆修正
test
CHANGED
@@ -61,8 +61,10 @@
|
|
61
61
|
|
62
62
|
```puts```はその内外を繋ぐ一種の窓口として存在します
|
63
63
|
```puts```の役目は標準出力という外部の処理系へ値を投げることであり、いったん役目を果たしてしまえばプログラムそのものを終了させようが問題はありません
|
64
|
-
|
64
|
+
最もプログラムを終了させた時点で言語と連携していた処理系と共にプロセスは終了するので、全ての値は破棄されます
|
65
65
|
|
66
66
|
```return```の機能はあくまで呼び出し元に値を吐き出すことであり、この手続きは**言語内で完結しています**
|
67
67
|
一方```puts```の機能は外部の実行環境と連携することであり、その一連の処理は**言語内で完結しません**
|
68
|
-
そのため```puts```の終了
|
68
|
+
そのため```puts```の終了を以ても「標準出力へコピーするために用いられた```puts```内の値」が消えるだけで、複製後の値は消失しません
|
69
|
+
|
70
|
+
最も言語の外へ渡された値を言語内に引き戻すことはできないので、言語内からは実質完全消失したも同然となります
|
2
コメントを受けての補足
test
CHANGED
@@ -17,3 +17,52 @@
|
|
17
17
|
|
18
18
|
尚、言語によっては**関数の終了時に宣言される値を戻り値として認識**する仕組みを採用するケースもあります
|
19
19
|
このような言語では戻り値を```return```でマークする必要はありません
|
20
|
+
|
21
|
+
# コメントへの補足
|
22
|
+
>「関数内の変数は、その関数の処理が終了すると消滅します」という部分ですが、消滅してしまったら、puts で処理も結果が出せないのでは?と思ってしまいます
|
23
|
+
|
24
|
+
まず、関数の実行には優先度があります
|
25
|
+
```
|
26
|
+
puts menu1.get_total_price(3)
|
27
|
+
```
|
28
|
+
上記の式であれば```menu1.get_total_price(3)```->```puts```の順序で呼び出されます
|
29
|
+
|
30
|
+
これは、```puts```を実行するために、まず**引数**を受け取る必要があるためです
|
31
|
+
ここでは引数に与える値の生成を```menu1.get_total_price(3)```が担当します
|
32
|
+
|
33
|
+
本回答の中で、以下のような説明を行いました
|
34
|
+
> メモリ内には、戻り値を一時的に記憶しておくための領域が確保されています
|
35
|
+
関数はこの領域に戻り値を一時的に**コピー**しておくことで、本来は関数内で消えてしまう値を保存しています
|
36
|
+
|
37
|
+
```puts```は引数でこの領域から値を受け取ります
|
38
|
+
つまり```menu1.get_total_price(3)```から地続きに値が渡されるのではなく、いったんこの関数が**外部へ出力した値**を引数へ**代入**した上で```puts```を実行します
|
39
|
+
|
40
|
+
そのため戻り値となる値が```menu1.get_total_price(3)```の内部で消失していようが関係ありません
|
41
|
+
```puts```が利用する値は、その消失の寸前に外部の領域へコピーされた値だからです
|
42
|
+
|
43
|
+
> 数値のような不変値をクラスなどを介さず」のこともクラスを介さずが何でクラス話が出てくるのかも理解ができません
|
44
|
+
これはクラスから生成されるインスタンスへの参照を介して、関数の内外で値を共有する手段が言語仕様としてサポートされているためです
|
45
|
+
|
46
|
+
これを適切に運用するには**参照型**や**アドレス**の概念を抑えている必要がありますが、概要だけを掻い摘むと、インスタンス内にフィールド値として値を定義しておくことで、その値はインスタンスを保持する変数からアクセスできるようになります
|
47
|
+
|
48
|
+
この時、インスタンスの性質が「可変」なのか「不変」であるのかで値に対する操作の可否が変わります
|
49
|
+
コメントの内容を鑑みる限り、このトピックについてはおそらくまだ未履修だと思われるので、現段階では話半分に流し読みして頂いて構いません
|
50
|
+
|
51
|
+
# 本題
|
52
|
+
詰まる所、```puts```と```return```の持つ意味は同一ではありません
|
53
|
+
```puts```は引数に渡された値を標準出力へ表示する関数の一種です
|
54
|
+
「標準出力へ表示する」とは、```puts```の内側で**標準出力を呼び出す関数**を宣言し、そこに引数の値を委譲することであると考えて下さい
|
55
|
+
|
56
|
+
言語の外には、コンソールやターミナルといった大元の実行環境があります
|
57
|
+
これらは様々な言語が連携することでシステムの構築と制御を行っています
|
58
|
+
プログラムというのは、この巨大な制御系の一部を間借りして稼働するプロセスに過ぎません
|
59
|
+
|
60
|
+
つまり```puts```内で値が消えようが、その値が言語の外部、すなはち実行環境の制御系に渡されていれば、あとの処理はその制御系の管轄であって、```puts```ではないのです
|
61
|
+
|
62
|
+
```puts```はその内外を繋ぐ一種の窓口として存在します
|
63
|
+
```puts```の役目は標準出力という外部の処理系へ値を投げることであり、いったん役目を果たしてしまえばプログラムそのものを終了させようが問題はありません
|
64
|
+
実際、ターミナルを閉じるかシェルを終了させることで、標準出力の内容は破棄されます
|
65
|
+
|
66
|
+
```return```の機能はあくまで呼び出し元に値を吐き出すことであり、この手続きは**言語内で完結しています**
|
67
|
+
一方```puts```の機能は外部の実行環境と連携することであり、その一連の処理は**言語内で完結しません**
|
68
|
+
そのため```puts```の終了あるいはプログラムそのものの終了を以ても「標準出力へコピーするために用いられた```puts```内の値」が消えるだけで、複製後の値は消失しません
|
1
誤字修正
test
CHANGED
@@ -14,3 +14,6 @@
|
|
14
14
|
そうなると例え最終的に```total_price```の持つ値(結果)は同じでも、それを確認、参照する術は失われます
|
15
15
|
|
16
16
|
戻り値はこう言った理由で必要とされます
|
17
|
+
|
18
|
+
尚、言語によっては**関数の終了時に宣言される値を戻り値として認識**する仕組みを採用するケースもあります
|
19
|
+
このような言語では戻り値を```return```でマークする必要はありません
|