Ruby englishNumber方法相关理论疑问及代码报错咨询
Hey there! Let's walk through each of your questions step by step—since you're just starting out with Ruby, I’ll make sure explanations are easy to follow. First, let’s recap your code (for context):
def englishNumber number if number < 0 return 'Please enter a number that isn\'t negative.' end if number == 0 return 'zero' end numString = '' onesPlace = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] tensPlace = ['ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'] teenagers = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'] # trillion left = number write = left/1000000000000 left = left - write*1000000000000 if write > 0 trillions = englishNumber write numString = numString + trillions + ' trillion' if left > 0 numString = numString + ' ' end end # billion write = left/1000000000 left = left - write*1000000000 if write > 0 billions = englishNumber write numString = numString + billions + ' billion' if left > 0 numString = numString + ' ' end end # million write = left/1000000 left = left - write*1000000 if write > 0 millions = englishNumber write numString = numString + millions + ' million' if left > 0 numString = numString + ' ' end end # thousand write = left/1000 left = left - write*1000 if write > 0 thousands = englishNumber write numString = numString + thousands + ' thousand' if left > 0 numString = numString + ' ' end end # hundred write = left/100 left = left - write*100 if write > 0 hundreds = englishNumber write numString = numString + hundreds + ' hundred' if left > 0 numString = numString + ' ' end end # tens write = left/10 left = left - write*10 if write > 0 if ((write == 1) and (left > 0)) numString = numString + teenagers[left-1] left = 0 else numString = numString + tensPlace[write-1] end if left > 0 numString = numString + '-' end end # ones write = left left = 0 if write > 0 numString = numString + onesPlace[write-1] end return number.to_s + '=' + numString #double equal sign between number and numString, why? end #test puts englishNumber( 0) puts englishNumber( 9) puts englishNumber( 10) puts englishNumber( 11) puts englishNumber( 17) puts englishNumber( 32) puts englishNumber( 88) puts englishNumber( 99) puts englishNumber(100) puts englishNumber(101) puts englishNumber(234) puts englishNumber(10000) puts englishNumber(1000000) puts englishNumber(1000000000000) gets.chomp
1. Why do I see two equal signs with a number in between when the method returns?
The issue comes from your recursive calls. When you process large numbers (like trillions), you call englishNumber write (e.g., englishNumber(1) for 1 trillion). That recursive call returns a string like 1=one because your return statement is number.to_s + '=' + numString.
When you concatenate this into the main numString, you end up with something like 1=one trillion, and then the final return adds another 1000000000000= in front—resulting in 1000000000000=1=one trillion.
To fix this, change the return statement to just numString, and handle the number=numString formatting outside the method in your test code, like:
puts "#{0}=#{englishNumber(0)}" puts "#{9}=#{englishNumber(9)}" # ... and so on for all test cases
2. Why do I get a "no implicit conversion of nil into String" error when replacing return with puts?
In Ruby, puts is an output method—it prints text to the console, but its return value is always nil.
When you replace the return statement with puts numString, every recursive call (like trillions = englishNumber write) will assign nil to trillions. Then when you try to do numString + trillions + ' trillion', you’re trying to concatenate a string with nil, which Ruby doesn’t allow—hence the TypeError.
3. How does just writing numString at the end of the method return it without puts or return?
This is one of Ruby’s handy features: implicit return. Unlike some languages that require an explicit return statement, Ruby automatically returns the result of the last expression executed in a method.
So if your method ends with numString, that variable’s value becomes the method’s return value—no need for return or puts here. puts would only print it to the console, but not pass the value back to the caller (which is critical for your recursive calls!).
4. What’s the difference between return and puts in Ruby?
They serve completely different purposes:
return: This is for specifying the value a method sends back to its caller. It stops the method’s execution immediately and passes the following expression’s value to whoever called the method. It has nothing to do with printing to the console.puts: This is for outputting text to the standard output (your console). It doesn’t return useful data—no matter what you print,putsitself always returnsnil. Its job is to display information, not pass values between methods.
内容的提问来源于stack exchange,提问作者Ludovico Zocchi

