gpt4 book ai didi

ruby-on-rails - 从对 super 的调用中清理一个 block

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

我正在使用 ActiveAttr,它为您提供了很好的通过 block 选项进行初始化:

person = Person.new() do |p|
p.first_name = 'test'
p.last_name = 'man'
end

但是,在包含 ActiveAttr::Model 的特定类中,我想绕过此功能,因为我想将该 block 用于其他用途。所以我们开始吧:

class Imperator::Command
include ActiveAttr::Model
end


class MyCommand < Imperator::Command

def initialize(*args, &block)
@my_block = block

super(*args)
end
end

这失败得很惨,因为该 block 仍然向上传递到链中,并最终在 ActiveAttr 内部运行此代码:

def initialize(*)
super
yield self if block_given?
end

所以如果我的电话看起来像这样:

MyCommand.new() { |date| date.advance(month: 1) }

失败如下:

NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80>

因为 MyCommand 没有方法 :advance it,所以对 MyCommand 的调用显然失败了。

所以我的问题是,有没有一种方法可以在我再次调用 super 之前从方法签名中删除该 block ,这样该 block 就不会超出我重写的初始化程序?

最佳答案

尝试

super(*args,&nil)

& 使 ruby​​ 使用 nil 作为 block ,而 ruby​​ 似乎足够聪明,可以意识到这意味着没有 block 。

关于ruby-on-rails - 从对 super 的调用中清理一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10541242/

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