Z
ZHANK
方法与块

块 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 }