0

ファーストネーム、ミドルネーム、ラストネームの長さを個別に取得し、最後に文字の合計量を追加するプログラムを作成しようとしています。私の答えは 18 ではなく 666 であり続けます。これが私が書いたコードです。

puts 'What is your first name?'

firstName = gets.chomp
realFirstName = firstName.length.to_i

puts 'What is your middle name?'

middleName = gets.chomp
realMiddleName = middleName.length.to_i

puts 'What is your last name?'

lastName = gets.chomp
realLastName = lastName.length.to_i

puts 'Did you know there are ' + realFirstName.to_s + realMiddleName.to_s + realLastName.to_s + ' letters in your name?'

どこで間違ったのか疑問に思っています。

4

4 に答える 4

2

最後の行で整数を文字列に変換しているため、数値を追加するのではなく、文字列を連結しています。あなたがしていることは次のとおりです。

"6" + "6" + "6"  #=> "666"

番号を呼び出すto_sのではなく、代わりに事前に合計してください。

letters_count = realFirstName + realMiddleName + realLastName
puts "Did you know there are #{letters_count} letters in your name?"

また、文字列補間を使用して、読みやすくしました。

はすでに整数を返しているため、を呼び出しto_iた後に を呼び出す必要もありません。lengthlength

于 2012-06-07T22:43:12.210 に答える
1

何が悪かったのか

あなたは何も追加していません。+ 演算子は、実際には、文字列と数値に対して異なる動作をするメソッドです。あなたの場合、realFirstName.to_s と友人は Fixnum オブジェクト (追加可能) を String オブジェクト (連結に同じ演算子を使用) に変換しています。#to_i と #to_s を使用しても問題はありませんが、変換のタイミングを間違えると問題が発生する可能性があります。

何がうまくいくか

String#length は、文字列内の文字数を返します。Fixnum を返し、Fixnum#+ メソッドは加算を実行するため、文字列に変換する前に呼び出すと、期待どおりに動作します。これらの例はどちらも同等である必要があります。

# Adding the Fixnum objects.
letter_count = realFirstName + realMiddleName + realLastName
puts "Did you know there are #{letter_count} letters in your name?"

# Adding the String lengths.
letter_count = realFirstName.length + realMiddleName.length + realLastName.length
puts "Did you know there are #{letter_count} letters in your name?"

この例では、すべての Fixnum オブジェクトを合計し、結果を文字列に補間します。#{} は暗黙的な #to_s を行うため、自分で行う必要がないことに注意してください。

冒険好きのための高度な Ruby イディオム

これがより明確であるかどうかに関係なく (おそらくそうではないでしょう)、実際の Ruby コードで次のような例に出くわすことになるでしょう。

puts "Did you know there are %d letters in your name?" %
  [firstName, middleName, lastName].map(&:length).reduce(:+)

Ruby は脳を曲げることができますが、楽しいものです。

于 2012-06-07T23:15:58.187 に答える
0

これは、そのコンテキストでのプラス記号が連結用であるためです。あなたのように"something" + "else"

別の変数を作成することで簡単に解決できます

size = realFirstName + realMiddleName+ realLastName

puts 'Did you know there are ' + size.to_s + ' letters in your name?'

または補間を行う

puts "Did you know there are #{realFirstName + realMiddleName + realLastName}  letters in your name?"

補間を使用するには二重引用符が必要であり、呼び出す必要がないことに注意してくださいto_s

最初のケースでは、補間を使用することもできます。

これがプラス記号で発生する理由を理解するには:Rubyのプラス記号は実際にメソッドを呼び出す演算子であり、あなたの場合は文字列で呼び出されます。1 + "asd+メソッドはFixnumをパラメーターとして想定しているため、これを行うとエラーが発生します。文字列の+メソッドは、文字列を想定しています。

于 2012-06-07T22:47:51.510 に答える
0

各用語の後に .to_s を記述する必要はありません。

于 2012-06-07T22:42:31.517 に答える