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

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

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

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

Q&A

解決済

1回答

322閲覧

Rubyのproc、lambda、.sendを用いた処理について、理解があっているかどうか

macaroni323

総合スコア31

Ruby

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

0グッド

0クリップ

投稿2019/07/14 07:59

お世話になります。
Rubyの学習をしており、問題を解いています。

Ruby

1Calc.new.one.plus.two # Should return 3 2Calc.new.five.minus.six # Should return -1 3Calc.new.seven.times.two # Should return 14 4Calc.new.nine.divided_by.three # Should return 3

英語で書かれた数字(onenineが09に相当)と四則計算(plus,minus,times,devided_byが+,-,*,/に相当)を変換して数値を返すというものです。

これに対しての解答例が以下のようなものだったのですが、正しく理解できているかわからないため、質問させていただきました。

class Calc { zero: 0, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9 }.each do |m, n| define_method("#{m}") { @proc ? @proc.call(n) : (@number ||= n ; self ) } end { plus: :+, minus: :-, times: :*, divided_by: :/ }.each do |m, o| define_method("#{m}") { @proc ||= lambda { |a| @number.send(o, a) }; self } end end

まず、上段のeachの処理にある、
** { @proc ? @proc.call(n) : (@number ||= n ; self ) }**
の解釈に関してですが、数字が「.newの直後の数字か、四則演算の後の数字か」を判断して、数字を返しているということでしょうか?

下段のeachの処理について
**{ @proc ||= lambda { |a| @number.send(o, a) }; self } **
@procが未定義だったらlamudaのブロックを実施、とのことですが、aはどこからきているのでしょうか?
これは四則計算のあとの数字がきた時の@proc.call(n)が実施されたときに受け取る値?(nをaとして受ける)ということでしょうか?

つまりCalc.new.one.plus.twoの場合は

最初の.oneで@number = 1
次のplus→1.send(:+ , a)というブロックを用意?定義?
最後の.two→ @proc.call(n)により、1.send(:+ , a)が呼び出され、aにnが渡り、1.send(:+, 2)=3

という処理をしていることになるでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

数字が「.newの直後の数字か、四則演算の後の数字か」を判断して、数字を返しているということでしょうか?

前半はいいとして、newの直後なら数字を保存して、演算子の後ならその演算子のメソッドを数字を引数にして呼び出して結果を返します。

aはどこからきているのでしょうか?
これは四則計算のあとの数字がきた時の@proc.call(n)が実施されたときに受け取る値?(nをaとして受ける)ということでしょうか?

その通りです。@proc.call(n)の実引数nが仮引数aに渡ります。

つまりCalc.new.one.plus.twoの場合は

合っています。

投稿2019/07/14 12:44

otn

総合スコア84555

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

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

macaroni323

2019/07/15 07:18

ありがとうございます。勉強になりました。
otn

2019/07/15 11:49

Calc.new.one.plus.two.plus.three とかやりたいけど、仕様を決めるのが難しいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問