我正在尝试编写一个程序,它单独占用我的第一个,中间名和姓的长度,然后最后添加总字母数。我的答案一直是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?'
只是想知道我哪里出错了。
答案 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代码中遇到更多如下例子。
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中的+方法需要一个字符串。