文章目录
Part3 迭代器
循环、分支
前备 — 块
块的形式
块中只有一行代码,用{}
包裹
{puts "Hello"}
多行代码使用do
、end
块实现
do
puts "A"
puts "B"
end
块调用
块可以视为方法调用,通过将块放在需要调用块的代码行末来实现。使用yield
声明调用一次块。
def call
puts "Start"
yield
yield
puts "End"
end
call {puts "Hello"}
# Start
# Hello
# Hello
# End
def call
puts "Start"
yield
puts "End"
end
call do
puts "Hello"
puts "Hello"
end
# Start
# Hello
# Hello
# End
yield
还可以传递参数
def call
yield("Hello", 99)
end
call {|arg1, arg2| puts arg1, arg2}
call do |arg1, arg2|
puts arg1
puts arg2
end
迭代器 Iterator
一个Ruby迭代器就是一个简单的能接收代码块的方法
特征:一个方法里面包含yield
调用,就一定是迭代器
块被当作一个参数传入迭代器方法,迭代器方法通过yield
来调用块,传入参数并执行
内置Iterator
each
对容器中的每个元素调用块
arr = [0, 1, 2, 3, 4, 5]
arr.each {|num| puts num}
# 逐个输出arr中的元素
each_with_index
该迭代器使用了两个参数element
和index
,element
为容器中的元素,index
为该元素的索引
arr = ['Ruby', 'Java']
arr.each_with_index do |ele, index|
puts "#{index}, is #{ele}"
end
# 0, I love Ruby!
# 1, I love Java!
collect
将容器中所有元素传递给块,然后在块中对所有元素统一处理后返回一个Array
arr = [0, 1, 2, 3]
arr_new = a.collect {|x| x * 2}
# arr_new = [0, 2, 4, 6]
循环结构
四种循环
while 语句
条件为true进入循环
while condition : # 或者 while condition do
puts "Hello"
end
do while 语句
执行一次待循环代码后再判断条件,为true进入下一次执行
# 形式1
begin
puts "Hello"
end while condition
# 形式2
puts "Hello" while condition
for 语句
对于list中的每个元素执行一次(同Python)
for var in list do
puts var
end
until 循环
条件为false进入循环
until condition do
puts "Hello"
end
控制语句
break 语句
终止最内层循环,跳入外层
next 语句
跳入本循环的下一个迭代
redo 循环
重新开始最内部循环的本次迭代
分支结构
if 语句
if (condition)
puts "Hello"
end
if - else 语句
if condition1 # 或者 if condition then
puts "condition1"
elsif condition2
puts "condition2"
else
puts "fail"
end
- ❗️ Ruby使用
elsif
,而C、C++、Java使用else if
,Python使用elif
❗️ - condition值
false
和nil
才为假,其他值都为真
unless 语句 (尽量不使用)
unless
与if
相同用法,意义相反,不满足条件执行
unless condition # 或者 unless condition then
puts "not satisfied"
end
unless condition
puts "1"
elsif
puts "2"
else
puts "3"
end
case 语句
对表达式匹配判断,进行分支选择
case expression
when condition1 # 可多个匹配选择 可使用保留字then,通常省略
puts "first code"
when condition2, condition3 then
puts "second code"
else
puts "default code"
end
when
使用===
判断expression是否在condition允许的范围内,举例 (1..5) === 5
返回true
===
不同于==