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

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

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

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

Q&A

解決済

4回答

2260閲覧

配列を使用した足し算ができない

ko-u

総合スコア61

Ruby

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

1グッド

2クリップ

投稿2019/01/25 10:14

編集2019/01/25 10:14

初めまして、Ruby初学者です。
現在、与えられた配列に対して+1をした値を配列で返す実装をしています。

例えば、以下のように配列の値を返す感じです。

・引数が [1, 2, 3]の場合、[1, 2, 4]を返す
・引数が [2, 7, 8, 8]の場合、[2, 7, 8, 9]を返す
・引数が [2, 7, 8, 9]の場合、[2, 7, 9, 0]を返す

しかし、上手く実装をすることができずにいます。

【エラー】

NoMethodError (undefined method `to_i=' for "999":String)

【コード】

def number(n) sum = n.join sum.to_i += 1 array = [] array << sum.split(“ , ”) end

ご教授頂けますと幸いです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

+=の左辺は変数である必要があります。代入するのだから、当たり前ですね。

また、数値をsplitすることはできませんし、文字列化してからsplitするにしても“ , ”で分割するというのが意味不明です。何を期待してのコードでしょうか?

案1:文字列化して結合して、+1して、文字列化して分割する(わかりやすい)

Ruby

1def number(ary) 2 sum = ary.join.to_i + 1 3 sum.to_s.split("") 4end

案2:文字列化せず、数値のままで処理する(初心者にはわかりにくいかも)

Ruby

1def number(ary) 2 sum = ary.inject{|n,i| n=n*10+i} + 1 3 sum.digits.reverse 4end

投稿2019/01/25 13:00

otn

総合スコア84505

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

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

ko-u

2019/01/28 05:34

ありがとうございます! とても参考になりました!
guest

0

質問はエラーの意味がわからないと解釈して回答します。

エラーは「文字列にto_i=なんてメソッドはねーよ」という意味です。

問題の箇所ですが、

Ruby

1sum.to_i += 1

やりたいことは

  1. sumを数値変換
  2. 数値変換したsumに1を加算したい

だと思います。

残念ながらto_iメソッドは破壊的メソッドではないので、sumのタイプは文字列のまま変わりません。
やるのであればsumに数値変換したsum(=sum.to_i)を代入する必要があります。


ついでに重要な点を。

Ruby

1array << sum.split(,)

上の回答が正しければ、sumは数値になっているので、このままではsplitは使えません。
splitを使ったとしても、sumは「123」の状態なので(",")で区切られません。

※他にも細かいところがありますが、おそらく動作に支障はないので省きます。

投稿2019/01/25 10:54

dice142

総合スコア5158

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

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

ko-u

2019/01/28 05:36

ご丁寧にありがとうございます! とても参考になりました!
guest

0

なぜ数値を配列で持つのだろう
数値で持ってて配列が必要な時にn.digits.reverseが楽そう

投稿2019/01/29 15:47

編集2019/01/29 16:31
Mt_Trail

総合スコア8

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

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

0

ベストアンサー

ruby

1sum.to_i += 1 # => NoMethodError (undefined method `to_i=' for "999":String)

sum.to_i の処理をした場合、結果として変数ではなく 数値そのものが返ってきます
(数値そのものには代入が効かない)

なので、この処理を書きたい場合は次のようにする必要があるかもしれません

ruby

1# 数値の計算と代入を分けて記述 2sum = sum.to_i + 1

別解

こういう書き方・やり方もあるんだなぁ くらいに思っていだたければ:

(書いたコードが動いているのか簡単に確認したいので) 最初に Rspec でテストコードに起こしてみます

ruby

1describe ArrayIncrement do 2 # この処理( {} で括った部分) について検査を実施 3 subject { ArrayIncrement.new(numbers_array).calc } 4 5 context '[1, 2, 3] の場合' do 6 # subject で使用している numbers_array の値をここで定義 7 let(:numbers_array) { [1, 2, 3] } 8 9 # subject の処理結果が期待する値 [1, 2, 4] と同一であるか検査 10 it { is_expected.to eq [1, 2, 4] } 11 end 12 13 context '[2, 7, 8, 8] の場合' do 14 let(:numbers_array) { [2, 7, 8, 8] } 15 16 it { is_expected.to eq [2, 7, 8, 9] } 17 end 18 19 context '[2, 7, 8, 9] の場合' do 20 let(:numbers_array) { [2, 7, 8, 9] } 21 22 it { is_expected.to eq [2, 7, 9, 0] } 23 end 24end

テストコードが書けたので今度は実装側のコードを書いてみます
(書けたと思ったら逐次 rspec コマンドでテストを実行してパスするかを確認します)

ruby

1class ArrayIncrement 2 def initialize(numbers_array) 3 @numbers_array = numbers_array 4 end 5 6 def calc 7 @numbers_array.join # [1, 3, 9] => '139' 8 .to_i # => 139 9 .yield_self { |n| n + 1 } # => 140 10 .to_s # => '140' 11 .chars # => ['1', '4', '0'] 12 .map(&:to_i) # => [1, 4, 0] 13 end 14end

あまり処理をつなげすぎても読む人の負担が増えるのでおすすめできないですが、上のように Integer とか String とか Object とか、型を行ったり来たりしながら書くこともできます

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

Links

投稿2019/01/26 01:04

gouf

総合スコア2321

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

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

ko-u

2019/01/28 05:34

ありがとうございます! とても参考になりました!
gouf

2019/01/28 15:46

今回の例だとテストコードが既にあるので、「わたしだったら こう書くのになぁ」みたいなことを気軽にやっていけたりします。rspec のコマンドを走らせて再検査すればいいので。 「よりよい書き方」を模索してみるのも良いかもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問