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

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

ただいまの
回答率

88.79%

ルビーの基本的書き方 配列の追加など

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 451

williamsArk

score 46

Rubyの超初心者です。配列を用意して、配列の一番最後の値より大きければ、入力した値を追加していく、という処理を練習で作ってみようと思い、以下の様にしていますが、うまく言っていません。
array.pushなどで配列に追加できるということは学習済みです。この辺はJavascriptと似ていますね。
ただし、length-1などと言った表現があるのか、ないのかを検索してもあまりわからず、結果どこがおかしいのか少し困惑しています。JSとごっちゃになっているところが多かったら申し訳ありませんが、アドバイスいただけると助かります。

puts "番号を入力してください。配列の1番大きな値より大きければ配列に入ります"
input = gets.chomp.to_i 

def sample(input)
  array = ["1, 2, 3, 4, 5, 6, 7, 8, 9, 10"]
  if input > array.length - 1 then 
    array.push(input)
  end 
end

puts sample(input)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+2

Rubyには負のインデックスがあるので

puts "番号を入力してください。配列の1番大きな値より大きければ配列に入ります"
input = gets.chomp.to_i 

def sample(input)
  array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  # 配列の末尾よりも大きければ
  if input > array[-1] then 
    array.push(input)
  end
  # arrayを評価しないと返り値にならない
  array
end

puts sample(input)

なおArray#maxを用いて

array.push(input) if input > array.max

の方がわかりやすいでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+1

コードは画像ではなくコピペし、マークダウンのコードブロックをお使いください。

以下の様にしていますが、うまく言っていません。

どういう動作を期待してどういう結果になっているのかを書くと回答を得やすいです。

length-1などと言った表現があるのか、ないのかを検索してもあまりわからず

「length-1」がセットではなく、「array_name.length」がセットです。
-1はただの計算なので、そこはしっかり理解しましょう。

また、検索して出ない場合はどんなワードで検索したのか、どんなページを見たのかわかるとアドバイスを貰えるかもしれません。


前置きを終えてコードの問題点に入ります。

gets.chomp.to_iはちょっと無駄でgets.to_iで良いです。
・sampleという関数が引数を必要としているのに、呼び出し(puts sample)で渡す値を指定していません。

指摘漏れがあったので追記
・配列の初期化方法がおかしいです。
・配列の最後の値以下の値を入力したとき、if文の中が評価されないため、nilが返ってきてしまいます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/16 18:42

    ご指摘ありがとうございます。

    番号を入力してください。配列の1番大きな値より大きければ配列に入ります
    50ターミナルでの実行結果が以下の様になりました。

    50 --->入力した値
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    50

    個人的には、{1,2,3,4,5,6,7,8,9,10,50}の様に後ろにくっつく状態になってくれるのかな、と思っていたのですが、どうやら配列と手動入力した数値が分離して表示されている様に見えます。

    ただいまここをなんとかしようとしています。
    お手数お掛けしました。

    キャンセル

  • 2019/05/16 18:46

    > どうやら配列と手動入力した数値が分離して表示されている様に見えます。
    そこに関しては回答に追記した部分で指摘しています。
    直近のコメントと入れ違いのようですが、mather様も指摘されていますね。

    キャンセル

  • 2019/05/16 18:49

    この様なところで詰まってしまうのが、まだまだですね。おかげさまでなんとかなりました。ありがとうございました。

    キャンセル

+1

https://www.ruby.or.jp/ja/tech/development/ruby/tutorial/
こういうチュートリアルなどを確認しておくといいかもしれません。

JSを既に理解しているとして、JSでも ["1, 2, 3, 4, 5, 6, 7, 8, 9, 10"] こんな書き方をしたら文字列一つだけが入った配列になるのは推測できますよね?
数値は 1 のように書けば良くてダブルクォーテーションは必要ないので、数値の配列は [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] となります。

配列の一番最後の値より大きければ

とありますが、 array.length - 1 は「配列の一番最後の値」でしょうか?
試しに array = [3,2,1,0] で確認してみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/16 18:53

    ああこれに関してはできました。
    array[array.length - 1]で解決できました。お騒がせいたしました。

    キャンセル

  • 2019/05/16 18:57

    もう少し踏み込むと、Rubyは「同じことを色々な書き方で実現できる」という考え方があったりします。
    たとえば array[-1] とか、array.last という書き方もあるんですよ。

    キャンセル

  • 2019/05/16 19:20

    array[-1]というのは知らなかったですね。確かにRubyは分かりやすいと聞きますが、単純な書き方もあるのですね。アドバイスありがとうございました。

    キャンセル

+1

「わたしだったらこう書くかもしれない」、というのを書いてみました

# グローバル変数として配列を定義
# TODO: class を定義してインスタンス変数に換えるなどスコープを短くする
$array = [*1..10] # Range を「*」 (Splat Operator) で展開して配列の値として利用

def push_to_array(input)
  # 三項演算子で処理を分岐
  input > $array.max ? $array.push(input) : $array
end

# 渡された文字列がすべて数字であるか判定する
def numeric?(string)
  return true if string =~ /\A\d+\z/

  false
end

def ask
  puts "\n番号を入力してください。"
  puts '既存の配列の1番大きな値より大きければ、指定した値が配列の末尾に追加されます。'
  print '値の指定 ([Enter] で確定): '
  input = gets.chomp # 一旦 String として受け取る

  # 数値として扱えるか判定して、ダメなら例外を発生させる
  raise RuntimeError unless numeric?(input)

  input.to_i

rescue RuntimeError
  # 数字以外が入力されたので 望む動作をユーザに伝える

  puts ''
  puts '*' * 10 # 「*」を10個出力する
  puts 'エラー: 数値を入力してください'
  puts '*' * 10
  retry
end


# 無限ループで何度でも実行できるようにする
loop do
  input = ask
  p push_to_array(input)
  # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
end

誰かのコードを読んだり、自分で書いたりしているうちに、ほかにも、「ここは こうできるんじゃないか」「ここは こうしたほうがいいんじゃないか」といった部分が思い浮かんでくるかもしれません

なにか参考になれば幸いです

Links

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/17 03:56

    詳細に回答頂きましてありがとうございました。色々読ませて頂き、今後の糧にしたいと思います。
    もし宜しければ、
    /\A\d+\Z/
    の意味を教えて頂けると幸いです。

    キャンセル

  • 2019/05/17 04:03 編集

    「正規表現」ですね
    * \A :「文字列の始まり」
    * \z :「文字列の終わり」
    * \d :「任意の数値」
    と、それぞれ特殊な意味があります

    詳しくはつぎのリンク、または別途 正規表現についてなど参照してみてください

    * [Rubular: a Ruby regular expression editor](https://rubular.com/ )
    * [Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript](https://regex101.com/ )

    キャンセル

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

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

関連した質問

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