块 Block
do...end 与 { } 块语法、yield 调用块、block_given?、&block 捕获
块 Block
Block 是 Ruby 的灵魂——不是函数参数,而是"可执行的代码片段"。yield 调用传入的块。
学完本章你将: 掌握 do...end / { } 语法、yield、block_given?、&block。
块语法
ruby
# do...end —— 多行块(常用)
[1, 2, 3].each do |n|
puts n * 2
end
# { } —— 单行块
[1, 2, 3].map { |n| n * 2 }
yield —— 调用块
ruby
def greet(name)
puts "开始"
result = yield(name) # 调用传入的块
puts "结束"
result
end
greet("小明") { |name| "你好, #{name}!" }
# 开始
# 结束
# => "你好, 小明!"
block_given? —— 块是否传入
ruby
def maybe_yield
if block_given?
yield
else
puts "没有传块"
end
end
maybe_yield # "没有传块"
maybe_yield { puts "有块" } # "有块"
&block —— 把块转成 Proc
ruby
def with_block(&block)
block.call("Hello") # 显式调用
[1, 2, 3].each(&block) # 传给其他方法
end
with_block { |item| puts item }