質問: init count.times do puts current # <= ここがyieldから変わっただけ current += diff end end arithmetic_sequence(init: 1, diff: 4, count: 10) ``` 例が悪いかもしれませんが、要は`yield`と書いてあるところでブロック内の処理をする、ということだと思います。 ならばブロック内の処理を`def...end` で関数定義し、`yield`と書いてあるところで呼び出せばいいだけ、と思ってしまいます(または上記例のようにyieldの箇所をそのまま`puts`のように置き換える) ブロックやProcを説明しているサイトは大抵「例が悪いが」とか「ありがたみが薄いかも」という注釈があるため、処理自体は理解できても、メリットが伝わりません。どういう場面で使うのか、具体的にメリットが感じられる例をご紹介頂けないでしょうか。 どういう流れでProcやLambdaを定義しようと思いつくのか、その思考回路でも構いません。 Qiitaの記事に『例えば、開発者Aが「5という数で好きな事をしてもらうメソッドを作ろう」と考えた場合』とあるような形です(この例もメリットは感じられませんでしたが。。) 依頼ばかりの質問で申し訳ないですが、よろしくお願いいたします。
回答: 決まった事しかしないなら、その決まった処理のコードを書けばいいです。 いろんな事を出来るようにするために、その処理を引数化します。 あなたの言っている事は、「 ``` def arithmetic_sequence current = 1 10.times do puts current current += 1 end end ``` と書けば、呼び出し側から初期値、増分、終了値を指定する必要が無くなります。」 と言ってるのと本質的には同じです。 また、 > > ならばブロック内の処理をdef...end で関数定義し、yieldと書いてあるところで呼び出せばいいだけ、と思ってしまいます > > > というのは、「引数にしなくても、グローバル変数で渡せばいいじゃない」と言っているのと同じです。 標準のメソッドで、`each` `map` `sort_by` などなど便利な物がたくさんありますが、 「`map`で呼び出してもらうメソッドを、(引数で渡すのじゃなくて)`map_callback`という名前で事前に定義した上で`map`を呼んでください」という仕様だと、`map`を複数回呼ぼうとした時点で破綻します。 追記 == 上記の後半(「また、」以降)が理解出来ないと言う事なので。 yoshikyさんの言ってるのはこういう事ですよね? 1. 処理を引数で渡さなくても、呼び出されるメソッドの中に直接処理を書けばいいじゃないか 2. それだと、他のことをしたいときに、メソッドを毎回書き直さないといけないじゃないか 3. じゃあ、書き直さなくて言いように、処理にdef~endで名前を付けて、その名前をメソッドの中から呼べばいいじゃないか 「その考えはこれと同じだよ」と私が書いたのは、 1. 引数なんかで渡さなくても、メソッド中でその値を直接書けばいいじゃないか 2. それだと、呼び出し時に値を変えたい時に困るじゃないか。メソッドにした意味がない 3. じゃあ、グローバル変数経由で値を渡せば引数が要らないですよ > > こちらは map(&:hoge)などの記法のことでしょうか。こちらもこのコードの意味は理解できても、メリットが思いつかない、 > > > そもそも、メソッドを作るメリットを何だと思っていますか?そこから分からないですか? メソッドに引数という仕組みがあるメリットは理解出来ますか?そこから分からないですか?