【问题标题】:Ruby DSL define_method with arguments带参数的 Ruby DSL 定义方法
【发布时间】: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 :)

标签: ruby dsl


【解决方案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】:

这有点奇怪,但您可以使用某种类型的evalinstance_evalmodule_evalclass_eval 可用于此目的,具体取决于上下文。类似的东西:

def command(method, *args)
  instance_eval <<-EOS, __FILE__, __LINE__ + 1
    def #{method}(#{args.join(', ')})
      # method body
    end
  EOS
end

这样您将获得每个方法的确切参数数量。是的,它可能比“一点”更奇怪。

【讨论】:

  • 漂亮的 hack :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2012-09-24
  • 2019-07-02
相关资源
最近更新 更多