我目前正在跳上Ruby列车,我有一些基本的Python知识,我希望这些知识对我有所帮助,但是我不清楚Ruby的"for"循环是如何工作的,我的感觉是它们的工作方式与Python相比不同。
一个例子可能是以下 python 代码:
print('Interest Calculator: ')
sumnum = eval(input('Enter your initial sum: '))
initnum = sumnum
rate = eval(input('Enter your interest rate: '))
noy = eval(input('Enter the number of years to calculate your interest for: '))
for i in range(noy):
sumnum = initnum * (1 + rate)
print('The value of your initial investment of £%s' %initnum, 'over the course of', noy, 'years is £%s' %sumnum)
这会产生以下内容(我输入随机数):
Interest Calculator:
Enter your initial sum: 250
Enter your interest rate: 3
Enter the number of years to calculate your interest for: 7
The value of your initial investment of £250 over the course of 7 years is £1000
这里的 for 循环的 Ruby 等价物是什么?
我试着这样做:
puts 'Interest Calculator: '
puts 'Enter your initial sum: '
sumnum = gets
initsum = sumnum
puts 'Enter your interest rate: '
rate = gets
puts 'Enter number of years for your interest: '
noy = gets
for i in noy do
sumnum = initsum * (1 + rate)
end
puts "The value of your investment of £#{initsum} over the course of #{noy} years is £#{sumnum}"
但是,这会产生以下错误:
Interest Calculator:
Enter your initial sum:
250
Enter your interest rate:
3
Enter number of years for your interest:
7
~/RubymineProjects/ExploreRuby/InterestRate.rb:9:in `<top (required)>': undefined method `each' for "7n":String (NoMethodError)
from -e:1:in `load'
from -e:1:in `<main>'
Process finished with exit code 1
任何帮助都非常感谢。
更改:
for i in noy do
sumnum = initsum * (1 + rate)
end
自:
noy.to_i.times do
sumnum = initsum.to_i * (1 + rate)
end
如果您坚持使用 for
循环,则:
for i in (1..noy.to_i) do
sumnum = initsum.to_i * (1 + rate)
end
ruby 中的 for
循环是围绕each
的包装器,因此您打算迭代的对象必须响应each
,noy
在这种情况下是一个字符串而不是Enumerable
对象
在 Ruby 中使用 'for' 通常使用 'each' 来写,这是更惯用的方式。如果您想阅读有关"for vs each"的更多信息,您可以在这里。
单行衬里(消除打开块的"do")可能是:
noy.to_i.times { sumnum = initsum.to_i * (1 + rate) }
end