オリアプ#5

今回もオリアプの四則演算機能について考えていきます。

まず初めに、コントローラーではなく、モデルに記述することから始めます。コントローラーに必要以上の情報があると、可読性が下がるので、モデルに処理を記述します。

イメージとして、モデルに条件式を作り、それをメソッドに定義して、そのメソッドをコントローラーで呼びまだす形にします。

 

model

def enzan(num)
  if num >= 0
    puts "0より大きい"
 else
   puts "0より小さい"
 end
end

と記述していた場合、それをコントローラーのどのアクションの時に使用するのか、考え、アクションの中で活用します。

num.enzan()
そうすることで、コントローラーで起動することができます。引数には受け渡したい情報を記述します。

 

とりあえず、モデルに記述していくので、軽く書きました。次に、条件式を実際に書いていきます。無事に情報の受け渡しができました。

>> 
post
=> {:memo=>"122+333"}

postの中にメモした情報が入るようにparamsで情報を渡しました。しかし、次の場所で問題が発生します。

post.include?("122")
=> false

postの中に122+333で122という数字があるにもかかわらず、Falseと出力されました。

post.include?("122+333")
=> false

ちなみに、postの中身と同じものにinclude?をかけても、Trueと出力されません。様々記述をしましたが、出力されませんでした。

rails cでコンソール起動して試したところ、Trueが出力されました。

[4] pry(main)> sum = "144+555"

=> "144+555"

[5] pry(main)> sum.include?("1")

=> true

[6] pry(main)> sum.include?("+")

=> true

となると、

 {:memo=>"122+333"}

これの部分がハッシュロケットになっているんで実際はpostの中にあるmemoの中に数値が入っているが入っているので上手くいかないのだと思います。

なので、post.include?をmemo.include?に配列の指定を変更したら上手くいきました。

 

それと、stringscannerだと、スキャンしていく必要がありましたが、scanだけの場合、正規表現にマッチしたものだけを取り出します。

memo.scan /\d+/と記述した場合、memoの中にある"122, 333"を取り出してくれます。なので、この配列の中身を1つずつ取り出して式に当て嵌めれば、上手くいきそうです。

sum = 0
integer = memo.scan(/\d+/)
integer.each do |num|
sum += num.to_i

こう記述することで、sum+122を行って、次に122+333を行ってくれます。これは配列がある限り続きます。num.to_iは、メモから取り出した文字列を数値に変えるために必要です。

これを四則演算全てに記述していこうと考えます。

足し算、掛け算は簡単です。
最初に0を足しても変わらないので、sumに0を入れておきます。
最初に1をかけても変わらないので、sumに1を入れておきます。

問題なのが、引き算と、割り算になります。
難しすぎたので、とりあえず、放置します。