初めまして、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
ご教授頂けますと幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア84505
0
質問はエラーの意味がわからないと解釈して回答します。
エラーは「文字列にto_i=
なんてメソッドはねーよ」という意味です。
問題の箇所ですが、
Ruby
1sum.to_i += 1
やりたいことは
sum
を数値変換- 数値変換した
sum
に1を加算したい
だと思います。
残念ながらto_i
メソッドは破壊的メソッドではないので、sum
のタイプは文字列のまま変わりません。
やるのであればsum
に数値変換したsum
(=sum.to_i
)を代入する必要があります。
ついでに重要な点を。
Ruby
1array << sum.split(“ , ”)
上の回答が正しければ、sum
は数値になっているので、このままではsplitは使えません。
splitを使ったとしても、sumは「123」の状態なので(",")
で区切られません。
※他にも細かいところがありますが、おそらく動作に支障はないので省きます。
投稿2019/01/25 10:54
総合スコア5158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
なぜ数値を配列で持つのだろう
数値で持ってて配列が必要な時にn.digits.reverseが楽そう
投稿2019/01/29 15:47
編集2019/01/29 16:31総合スコア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
総合スコア2321
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/28 05:34