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

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

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

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

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

4回答

459閲覧

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

williamsArk

総合スコア46

Ruby

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

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

1グッド

1クリップ

投稿2019/05/16 08:59

編集2019/05/16 09:14

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)
DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

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

ruby

1puts "番号を入力してください。配列の1番大きな値より大きければ配列に入ります" 2input = gets.chomp.to_i 3 4def sample(input) 5 array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 6 # 配列の末尾よりも大きければ 7 if input > array[-1] then 8 array.push(input) 9 end 10 # arrayを評価しないと返り値にならない 11 array 12end 13 14puts sample(input)

なおArray#maxを用いて

ruby

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

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

投稿2019/05/16 10:19

asm

総合スコア15147

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

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

0

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

ruby

1# グローバル変数として配列を定義 2# TODO: class を定義してインスタンス変数に換えるなどスコープを短くする 3$array = [*1..10] # Range を「*」 (Splat Operator) で展開して配列の値として利用 4 5def push_to_array(input) 6 # 三項演算子で処理を分岐 7 input > $array.max ? $array.push(input) : $array 8end 9 10# 渡された文字列がすべて数字であるか判定する 11def numeric?(string) 12 return true if string =~ /\A\d+\z/ 13 14 false 15end 16 17def ask 18 puts "\n番号を入力してください。" 19 puts '既存の配列の1番大きな値より大きければ、指定した値が配列の末尾に追加されます。' 20 print '値の指定 ([Enter] で確定): ' 21 input = gets.chomp # 一旦 String として受け取る 22 23 # 数値として扱えるか判定して、ダメなら例外を発生させる 24 raise RuntimeError unless numeric?(input) 25 26 input.to_i 27 28rescue RuntimeError 29 # 数字以外が入力されたので 望む動作をユーザに伝える 30 31 puts '' 32 puts '*' * 10 # 「*」を10個出力する 33 puts 'エラー: 数値を入力してください' 34 puts '*' * 10 35 retry 36end 37 38 39# 無限ループで何度でも実行できるようにする 40loop do 41 input = ask 42 p push_to_array(input) 43 # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 44end

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

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

Links

投稿2019/05/16 18:15

編集2019/05/16 19:07
gouf

総合スコア2321

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

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

Asylum35aO2

2019/05/16 18:56

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

2019/05/16 19:04 編集

「正規表現」ですね * \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/ )
guest

0

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 09:40

mather

総合スコア6753

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

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

dice142

2019/05/16 09:43

> array.length - 1 は「配列の一番最後の値」でしょうか? そこにもミスがあったとは気付かなかった、、、
mather

2019/05/16 09:51

ひとまずコードを書くのはいいんですが細かい部分での文法がそもそもわからないのなら、まず一通り学んでからにしたほうがいいと思います。 もしたまたまうまく動いたとしても、なぜうまく動くのか理解できていないままでは全く応用が効きません。
williamsArk

2019/05/16 09:51

回答いただきましてありがとうございました。配列の最後の値、としたかったのが、知識不足で違った風に伝わってしまいましたね。今は最後の値の「数値」の数より大きければ、という風に調整しています。
williamsArk

2019/05/16 09:53

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

2019/05/16 09:57

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

2019/05/16 10:20

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

0

ベストアンサー

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

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

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

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

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

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


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

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

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

投稿2019/05/16 09:08

編集2019/05/16 09:32
dice142

総合スコア5158

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

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

williamsArk

2019/05/16 09:14

質問の際の規則などがまだはっきり把握できておらず、お手数をお掛け致します。 また回答いただきありがとうございました。 引数を置いていませんでした。そこはやってはいけないミスでした。 ただ、まだ正しい挙動になっていない様なので、そこが次の課題です。
dice142

2019/05/16 09:34

質問の際のヒントはヘルプページを参考にしてください。 https://teratail.com/help/question-tips また、指摘漏れが合ったので追加しました。 回答にも書いてますが「正しい挙動になっていない」とはどういう動作になっていて、理想はどういうものか示していただけると助かります。
williamsArk

2019/05/16 09: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}の様に後ろにくっつく状態になってくれるのかな、と思っていたのですが、どうやら配列と手動入力した数値が分離して表示されている様に見えます。 ただいまここをなんとかしようとしています。 お手数お掛けしました。
dice142

2019/05/16 09:46

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

2019/05/16 09:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問