循环是一种控制结构,可以让代码根据给定的条件重复执行。
while循环while循环是一种控制结构,可以让代码根据给定的条件重复执行。
只要条件为真,while循环中的代码就会继续执行。
当迭代次数事先未知时,通常会用while循环;不过只要需要循环,任何场合都可以用它。
条件会在循环中的代码执行之前先求值,也就是说,如果条件为假,循环中的代码就永远不会执行。
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
如果想迭代一个字符串,可以按照字符串的长度来循环。
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until循环until循环的工作方式和while循环相同,只是循环中的代码会一直执行,直到条件为真为止。
这和if与unless之间的区别是一样的。
i = 0
until i == 3
puts i
i += 1
end
使用while循环时,一个常见的错误是进入“无限循环”,从此再也退不出来。
无限循环可能是由于条件永远不为真也不为假造成的。
这通常是程序员的失误造成的,比如忘记让循环变量自增。
但有时候,无限循环是实现程序逻辑最清晰的方式。
有时候又必须让循环一直运行下去,比如 HTTP 服务器会等待一个连接进来,处理它,然后再等待下一个连接。
break用break关键字可以提前跳出循环。
当你想在特定条件下提前跳出循环时,它会很方便。
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
next用next关键字可以跳到循环的下一次迭代。
当你想跳过循环中的某几次迭代时,它会很方便。
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
循环中变量的类型可能会发生变化。
在下面的例子中,a的类型是Int32 | String,因为在循环的前半部分,它既可能是Int32,也可能是String。
变量a只在循环的前半部分具有Int32 | String类型,因为循环开始时它保存的是Int32,而到第二次迭代时,它保存的是String。
这种多类型系统会在后面详细讲解。
不过,由于我们确信循环的后半部分只会保存String,所以在循环的后半部分,a的类型是String。
在运行时,它绝不会同时保存Int32和String。
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
在 Crystal 中,方法会返回最后一个表达式的值。
不过,有时候你需要在最后一个表达式之前就返回一个值。
为此,可以使用return关键字,它会返回紧随其后的那个表达式的值。
写在return关键字后面的代码不会被执行。
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
当方法中最后一个表达式就是要返回的值时,应省略return关键字。
在本练习中,你将处理储蓄账户。 每年,储蓄账户的余额都会根据其利率更新。 银行给你的利率取决于你账户里的金额(即余额):
1000美元时,利率为 0.5%。1000美元且小于5000美元时,利率为 1.621%。5000美元时,利率为 2.475%。本练习有四个任务,每个任务都会涉及你的余额及其利率。
实现方法SavingsAccount.interest_rate(),它接收一个余额作为实参。
该方法应返回给定余额对应的利率。
SavingsAccount.interest_rate(200.75)
# => 0.5
实现方法SavingsAccount.interest(),它接收一个余额作为实参。
该方法应返回给定余额对应的利息。
SavingsAccount.interest(200.75)
# => 1.00375
实现方法SavingsAccount.annual_balance_update(),它接收一个余额作为实参。
该方法应返回一年后的余额。
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
实现方法SavingsAccount.years_before_desired_balance(),它接收余额和目标余额作为实参。
该方法应返回达到目标余额所需的年数。
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
计算本金余额的单利时,将余额乘以利率,两者的乘积就是利息金额。
而复利则是定期计息。 每次计息时,先算出利息金额并加到本金余额上,这样后续的利息计算就会基于更大的本金余额。