带参数的 Ruby DSL 定义方法
Posted
技术标签:
【中文标题】带参数的 Ruby DSL 定义方法【英文标题】:Ruby DSL define_method with arguments 【发布时间】:2013-11-12 20:09:35 【问题描述】:这就是我想要做的。
# DSL Commands
command :foo, :name, :age
command :bar, :name
# Defines methods
def foo(name, age)
# Do something
end
def bar(name)
# Do something
end
基本上,我需要一种通过define_method
处理参数的方法,但我想要定义数量的参数而不是arg 数组(即*args
)
这是我目前所拥有的
def command(method, *args)
define_method(method) do |*args|
# Do something
end
end
# Which would produce
def foo(*args)
# Do something
end
def bar(*args)
# Do something
end
想法?
【问题讨论】:
我不明白but I want a defined number of arguments instead of an arg array (i.e. *args)
- 任何例子......
查看更新的问题。在我所拥有的内容下添加了示例。
你的有什么问题?
我希望限制参数的数量,这样我就知道要调用多少个。
你的帖子不清楚..sorry :)
【参考方案1】:
我认为最好的解决方法是执行以下操作:
def command(method, *names)
count = names.length
define_method(method) do |*args|
raise ArgumentError.new(
"wrong number of arguments (#args.length for #count)"
) unless args.length == count
# Do something
end
end
【讨论】:
我一半喜欢,一半不喜欢。让我想想。 :)【参考方案2】:这有点奇怪,但您可以使用某种类型的eval
。 instance_eval
、module_eval
或 class_eval
可用于此目的,具体取决于上下文。类似的东西:
def command(method, *args)
instance_eval <<-EOS, __FILE__, __LINE__ + 1
def #method(#args.join(', '))
# method body
end
EOS
end
这样您将获得每个方法的确切参数数量。是的,它可能比“一点”更奇怪。
【讨论】:
漂亮的 hack :)以上是关于带参数的 Ruby DSL 定义方法的主要内容,如果未能解决你的问题,请参考以下文章