gpt4 book ai didi

Ruby 元编程

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

我正在尝试编写一个允许我做的 DSL

Policy.name do
author "Foo"
reviewed_by "Bar"
end

下面的代码几乎可以处理:

class Policy
include Singleton
def self.method_missing(name,&block)
puts name
puts "#{yield}"
end
def self.author(name)
puts name
end
def self.reviewed_by(name)
puts name
end
end

将我的方法定义为类方法 (self.method_name) 我可以使用以下语法访问它:

Policy.name do
Policy.author "Foo"
Policy.reviewed_by "Bar"
end

如果我从方法名称中删除“self”,并尝试使用我想要的语法,那么我会在 Main 中收到错误“Method not Found”,因此它无法找到我的函数,直到模块 Kernel.没关系,我理解错误。但我该如何解决呢?我怎样才能修复我的类以使其与我想要的语法一起工作?

最佳答案

为了控制 block 范围内的self(因为author解析为self.author),你可以使用instance_eval

class Policy
def self.name(&block)
PolicyNameScope.new(block)
end

class PolicyNameScope
def initialize(block)
instance_eval(&block)
end

def author(author)
@author = author
end

def reviewed_by(reviewed_by)
@reviewed_by = reviewed_by
end
end
end

policy = Policy.name do
author "Dawg"
reviewed_by "Dude"
end

p policy
# => #<Policy::PolicyNameScope:0x7fb81ef9f910 @reviewed_by="Dude", @author="Dawg">

PolicyNameScope 类具有 name block 中允许的实例方法。这样一来,Policy 中的方法在 block 内不可用,从而使 DSL 更加严格。

由于您的示例脱离了上下文,我无法进一步帮助您 - 这段代码本身似乎不是很有用。

关于Ruby 元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2935894/

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