Ruby on rails 如何获取实例方法参数?

Ruby on rails 如何获取实例方法参数?,ruby-on-rails,ruby,parameters,instance-method,Ruby On Rails,Ruby,Parameters,Instance Method,我正在尝试检索几个实例方法的参数。Ruby的惯用方法如下: class A def test(id) puts id end end A.instance_method(:test).parameters #=> [[:req, :id]] 这种方法在大多数情况下都是有效的,但是我用某些方法得到了一些奇怪的结果,我不知道为什么 module Events class Repository def find(id) #code end

我正在尝试检索几个实例方法的参数。Ruby的惯用方法如下:

class A
  def test(id)
    puts id
  end
end

A.instance_method(:test).parameters

#=> [[:req, :id]]
这种方法在大多数情况下都是有效的,但是我用某些方法得到了一些奇怪的结果,我不知道为什么

module Events
  class Repository
    def find(id)
      #code
    end
    def delete(id)
      #code
    end
  end
end

Events::Repository.instance_method(:find).parameters
#=> [[:req, :id]]

Events::Repository.instance_method(:delete).parameters
#=> [[:rest, :args], [:block, :block_for_method]]
这是Ruby bug吗


注意:我正在Rails控制台中键入上述内容。

我不知道您为什么会出现这种行为,但如果您回答我前面评论中的问题,我们可能会找到答案

然而,作为对您问题的回答,我可以说它不一定是Ruby中的bug。下面是一个小型ruby程序的示例,该程序将提供与您获得的相同类型的输出:

module X
  def delete(*args, &block)
  end
end

class Y
  prepend X
end    

class Y   # reopen the existing class
  def delete(x)
  end
end

p Y.instance_method(:delete)   # => #<UnboundMethod: Y(X)#delete>
p Y.instance_method(:delete).parameters # => [[:rest, :args], [:block, :block]]
模块X
def delete(*参数和块)
结束
结束
Y类
前置X
结束
类Y#重新打开现有类
def删除(x)
结束
结束
py.instance_方法(:delete)#=>#
py.instance_方法(:delete).parameters#=>[:rest,:args],:block,:block]]

我不知道你为什么会有这样的行为,但是如果你回答了我之前评论中的问题,我们可能会找到答案

然而,作为对您问题的回答,我可以说它不一定是Ruby中的bug。下面是一个小型ruby程序的示例,该程序将提供与您获得的相同类型的输出:

module X
  def delete(*args, &block)
  end
end

class Y
  prepend X
end    

class Y   # reopen the existing class
  def delete(x)
  end
end

p Y.instance_method(:delete)   # => #<UnboundMethod: Y(X)#delete>
p Y.instance_method(:delete).parameters # => [[:rest, :args], [:block, :block]]
模块X
def delete(*参数和块)
结束
结束
Y类
前置X
结束
类Y#重新打开现有类
def删除(x)
结束
结束
py.instance_方法(:delete)#=>#
py.instance_方法(:delete).parameters#=>[:rest,:args],:block,:block]]

Linux中使用Rails控制台for Rails 3.2.13和ruby 2.0.0p247时,我无法再现这一点。如果将类名更改为像香蕉这样的随机名称,会得到不同的结果吗?
Events::Repository.existences
显示了什么?
Events::Repository.instance\u方法(:delete)
显示了什么?可能前面有一个模块定义了
delete
。您使用的是什么版本的Ruby和什么版本的Rails?我无法在Linux中使用Rails控制台for Rails 3.2.13和Ruby 2.0.0p247来重现这一点。如果将类名更改为像香蕉这样的随机名称,会得到不同的结果吗?
Events::Repository.existences
显示了什么?
Events::Repository.instance\u方法(:delete)
显示了什么?可能前面有一个模块定义了
delete
。您使用的是什么版本的Ruby和什么版本的Rails?是的,这似乎是个问题。我正在使用水族馆gem,它实现了面向方面的模式,允许我在运行特定方法之后运行方法(类似于Rails控制器中的“before_filter”和“after_filter”)。就像你建议的那样,它似乎提前结束了。你知道有什么方法可以解决这个问题吗?另外,我相信在你文章的最后两行中“Y”应该是“X”。不,我的意思是说Y.Y是你打开的类,并添加了一个
delete
方法,Y对应于你的例子中的
Events::Repository
。我不知道有什么方法可以隔离Y中定义的
delete
方法,并计算出您有多少种方法。也许这是Ruby缺少的一个特性。然而,您还没有告诉我您实际上想要完成什么,所以我怀疑可能有更好的方法来完成它,而不使用反射。或者,您可以将探测的方法重命名为
delete
。是的,这似乎就是问题所在。我正在使用水族馆gem,它实现了面向方面的模式,允许我在运行特定方法之后运行方法(类似于Rails控制器中的“before_filter”和“after_filter”)。就像你建议的那样,它似乎提前结束了。你知道有什么方法可以解决这个问题吗?另外,我相信在你文章的最后两行中“Y”应该是“X”。不,我的意思是说Y.Y是你打开的类,并添加了一个
delete
方法,Y对应于你的例子中的
Events::Repository
。我不知道有什么方法可以隔离Y中定义的
delete
方法,并计算出您有多少种方法。也许这是Ruby缺少的一个特性。然而,您还没有告诉我您实际上想要完成什么,所以我怀疑可能有更好的方法来完成它,而不使用反射。或者,您可以将探测的方法重命名为
delete