如何将字符串的长度一起添加?

时间:2012-06-07 22:36:40

标签: ruby

我正在尝试编写一个程序,它单独占用我的第一个,中间名和姓的长度,然后最后添加总字母数。我的答案一直是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 个答案:

答案 0 :(得分: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后也无需调用length,因为length已经返回一个整数。

答案 1 :(得分: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可以成为一个大脑弯曲者,但它很有趣!

答案 2 :(得分:0)

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

答案 3 :(得分: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中的+方法需要一个字符串。