0

我正在尝试编写一个程序,该程序分别获取我的名字、中间名和姓氏的长度,然后最后将字母总数相加。我的答案一直是 666 而不是 18。这是我编写的代码。

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

由于您在最后一行将整数转换回字符串,因此您正在连接strings,而不是添加数字。你正在做的是:

"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调用之后也不需要调用length,因为length已经返回一个整数。

于 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?"

In this example, we add up all the Fixnum objects, then interpolate the result into our string. Note that #{} does an implicit #to_s for you, so you don't have to do it yourself.

An Advanced Ruby Idiom for the Adventurous

Whether or not this is clearer (it probably isn't), you'll probably run across a lot more examples like the following in real-world Ruby code.

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

Ruby can be a brain-bender, but it's fun!

于 2012-06-07T23:15:58.187 回答
0

你不需要在每个学期之后写 .to_s 。

于 2012-06-07T22:42:31.517 回答
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 作为参数。string 中的 + 方法需要一个字符串。

于 2012-06-07T22:47:51.510 回答