お世話になります。
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
という処理をしていることになるでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/15 07:18
2019/07/15 11:49