You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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, puts itself always returns nil. Its job is to display information, not pass values between methods.

内容的提问来源于stack exchange,提问作者Ludovico Zocchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:37:42