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

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

ただいまの
回答率

90.61%

  • Ruby

    7351questions

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

rubyのunless文内にif分の条件を付け加えたときの実行の有無

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 812

ayu

score 196

rubyの文法を勉強していて、自分なりに改造しようとして、実行されない理由がわかりませんでした。

puts "パスワードを入力してください"
password = gets.chomp

# 変数password_lengthにpasswordの文字数を代入してください
password_length = password.length

# password_lengthが0でない場合に"パスワードが入力されました"とputsしてください
unless password_length == 0
    puts "パスワードが入力されました"
else
    puts "ちゃんと入れろゴルァ!"
    password = gets.chomp
    if password_length > 4 && password_length < 10
        puts "パスワードは適切な長さです"
    end
end

# password_lengthが4文字以上10文字以下の場合に"パスワードは適切な長さです" とputsしてください
if password_length > 4 && password_length < 10
  puts "パスワードは適切な長さです"
end

この文章のここの部分です。
unless password_length == 0
    puts "パスワードが入力されました"
else
    puts "ちゃんと入れろゴルァ!"
    password = gets.chomp
    if password_length > 4 && password_length < 10
        puts "パスワードは適切な長さです"
    end
end
# password_lengthが4文字以上10文字以下の場合に"パスワードは適切な長さです" とputsしてください
if password_length > 4 && password_length < 10
  puts "パスワードは適切な長さです"
end
ここのunlessからのif分で入力せずに、パスワードを再入したときに、パスワードを5文字にしても、数値が表示されるだけです。
また、条件分の中で入力されない限りループを回したいとも考えましたが、なかなか思いつきませんでした。
何かいい手はありますでしょうか?
if notでもif分でも構いません。
宜しくお願いしますm(_  _)m
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

passwordを再入力して貰った後に、password_lengthにパスワードの長さを再代入しないと、古いパスワードの長さのままになります。
    puts "ちゃんと入れろゴルァ!"
    password = gets.chomp
    password_length = password.length # もう一回長さを入れないと!
    if password_length > 4 && password_length < 10
        puts "パスワードは適切な長さです"
こんな感じで修正すれば、想定通りに動くかなとも思います。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/24 22:53

    うまく動きました。
    ありがとうございます。

    キャンセル

checkベストアンサー

+2

数値が表示されるだけです。 
数値を表示するコードはどこにも無いので、勘違いではないでしょうか?

"パスワードは適切な長さです"と表示されないのは、password_lengtを再設定していないからです。
あと、password_length > 4 && password_length < 10だと、「5以上9以下」ですよ。

望みの長さの文字列が入力されるまでループするには、breakを使うと良いでしょう。
password = nil #これを書かないと変数がdo/end内ローカルになる
password_length = nil #同上
loop do
  puts "4文字以上10文字以下のパスワードを入力してください"
  password = gets.chomp
  password_length = password.length
  if (4..10).include? password_length
    puts "パスワードは適切な長さです"
    break
  end
  puts "ちゃんと入れろゴルァ!"
end
あるいは、もっとシンプルに、
password = loop do
  puts "4文字以上10文字以下のパスワードを入力してください"
  pw = gets.chomp
  if (4..10).include? pw.length
    puts "パスワードは適切な長さです"
    break pw
  end
  puts "ちゃんと入れろゴルァ!"
end
password_length = password.length
とか。普通は、メソッドにするんじゃないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/24 22:52

    自分が知らない知識があり、大変勉強になりました!
    ありがとうございます。

    キャンセル

0

適切な長さのパスワードが入力されるまでループするような関数を書いてみました。

ef input_password
  puts 'パスワードを入力してください'

  loop do
    password = gets.chomp

    if password.length > 0
      puts 'パスワードが入力されました'
      if password.length.between?(4, 10)
        puts ' パスワードは適切な長さです'
        return password
      end
      puts ' パスワードの長さが不適です'
    end

    puts 'ちゃんと入れろゴルァ!'
  end
end

password = input_password
puts password

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/11 11:42

    katoyさん

    ずいぶん前の質問に回答していただき、ありがとうございますm(_ _)m
    自分も前から成長していると思うので、懐かしいなって感じました。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7351questions

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