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

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

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

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

Q&A

解決済

2回答

1012閲覧

メソッドをオブジェクト化して利用したい

Sho.ik

総合スコア18

Ruby

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

0グッド

0クリップ

投稿2019/08/09 14:51

メソッドをオブジェクト化して利用したい

Rubyを勉強中の者です。よくわからなくなってきました。「メソッドをオブジェクト化して引数にできる」ということを知って、実験していました。しかし、どうにもうまく実行できていません。原因がよくわかりません。

メソッドの定義①file名:my_global_methods.rb

1.メソッド
入力された値に対して、その値が不適切であれば、もう一度入力を促すメソッド

2.変数
object ➡ 入力対象
condition ➡ 条件(引数1つのメソッド)
input_value ➡ 入力値

ruby

1def input_repeat(object,condition) 2 puts object + "を入力してください:" 3 input_value = gets.chomp.to_i 4 until condition.call(input_value) do 5 puts "入力が適切ではないです。もう一度。" 6 puts object + "を入力してください:" 7 input_value = gets.chomp.to_i 8 end 9 return input_value 10end

メソッドの定義②file名:my_math_methods.rb

メソッド
最小の逆元を返すメソッド

<逆元の説明>

「法」と呼ばれる数字を7とします。
23を法で割った余りは2になります。
「23になにを掛けたら、法で割って余り1になるか」←この問の答えを「(7を法とする)23の逆元」という。
(答え 最小の逆元は、4です)

変数
mod ➡ 法
number ➡ 逆元を求めたい値

ruby

1def mod_inverse(mod,number) 2 3 if mod <= 1 then 4 return 0 5 else 6 a = number % mod 7 for index in 1..mod do 8 if a*index % mod == 1 then 9 return index 10 end 11 end 12 end 13 14 return "none" 15 16end

メソッドの定義③file名:my_math_methods.rb

整数か否かを判定

変数
input_value ➡ 入力値

ruby

1def integer_number(input_value) 2 if input_value%1==0 then 3 return true 4 else 5 return false 6 end 7end

メソッドの定義④file名:my_math_methods.rb

自然数か否かを判定

変数
input_value ➡ 入力値

ruby

1def natural_number(input_value) 2 if integer_number(input_value)==true && input_value>=1 then 3 return true 4 else 5 return false 6 end 7end

ソースコード

ruby

1require "./my_global_methods" 2require './my_math_methods' 3 4sentense1 = "法(自然数)" 5condition1 = method(:natural_number) 6sentense2 = "逆数を求めたい数(整数)" 7condition2 = method(:integer_number) 8 9mod = input_repeat(sentense1,condition1) 10number = input_repeat(sentense2,condition2) 11 12if mod_inverse(mod,number) == 0 13 puts "法は自然数で入力してください" 14elsif mod_inverse(mod,number) == "none" 15 puts "逆元はありませんでした" 16else 17 puts "逆元は#{mod_inverse(mod,number)}でした。" 18end 19 20b = gets

条件に沿った入力値であれば、ちゃんと答えを返してくれます。
しかし、条件に沿わない入力をしたときに、繰り返し入力を促してくれません。

ご教授お願いします。

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

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

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

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

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

guest

回答2

0

入力メソッド群を書き換えてみました。
整数判定を 正規表現で行うようにしました。
判定メソッドは true/false を返すのではなく、
正当な入力なら その評価値を、 不正な入力なら nil を返す
ようにしました。

a.rb

ruby

1# frozen_string_literal: true 2 3def input_with_retry(name, condition) 4 message = "#{name}を入力してください:" 5 loop do 6 puts message 7 val = condition.call(gets.chomp) 8 return val if val 9 10 puts '入力が適切ではないです。もう一度。' 11 end 12 nil 13end 14 15def integer_number(str) 16 return str.to_i if /\A[+-]?\d+\z/ =~ str 17 18 nil 19end 20 21def natural_number(str) 22 val = integer_number(str) 23 return val if val&.positive? 24 25 nil 26end 27 28a = input_with_retry('整数', method(:integer_number)) 29puts "a: #{a}" 30b = input_with_retry('自然数', method(:natural_number)) 31puts "b: #{b}"

実行例
イメージ説明

投稿2019/08/09 22:50

katoy

総合スコア22324

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

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

Sho.ik

2019/08/10 08:17

回答ありがとうございます! まだ正規表現は勉強していませんが、かなりすっきり記述できるんだとわかりました!
guest

0

ベストアンサー

gets.chomp.to_iと整数にしているので、"3.5"と入力しても3になるからでは?

投稿2019/08/09 15:02

otn

総合スコア84555

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

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

Sho.ik

2019/08/09 15:07

ありがとうございます!解決できました! 入力の型を決めないといけないのですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問