gpt4 book ai didi

ruby - 以 `=` 结尾的方法可以接受 block 吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:30 24 4
gpt4 key购买 nike

这似乎适用于方法名称不以 = 结尾的情况。

class C
def x= value = nil, &block
end
end

c = C.new

c.x = 1 # => fine
c.x=(2) # => fine
c.method(:x=).call { 3 } # => fine
c.x= { 4 } # => syntax error
c.x= do
5
end # => syntax error

有没有人知道这是为什么,或者是否有与这两个不起作用的相似语法?

示例用法:

logger.level=(:debug) do
# log at debug level inside this block
end

当然还有很多选择,比如:

logger.with_level(:debug) do
# log at debug level inside this block
end

我只是想知道我是否遗漏了一些语法方面的东西,或者是否有人对此行为有任何解释。

最佳答案

=结尾的方法被称为Assignment methods ,因此所有赋值规则都适用。

任何赋值语句都可以描述为

LHS = RHS

LHS 是左手边,RHS 是右手边。

RHS 被评估为 LHS 的新值,如果尝试使用使用 {...} 将 block 指定为 RHS,它将被解释为 Hash 文字的定义并导致编译错误,因为它是无效的 hash。同样,do...end block 将导致其他编译错误。

赋值方法应始终具有单个参数,其值可以分配给实例变量,或者其值可用于为实例变量派生新值。

如果您愿意,可以使用 Proclambda 作为参数,因为它们是对象。

class C
def x= value
@x = (value.class == Proc ? value.call : value)
p @x
end
end

c = C.new

# fine
c.x = -> {10}
c.x = lambda {20}
c.x = Proc.new {30}

关于ruby - 以 `=` 结尾的方法可以接受 block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34478926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com