English 中文(简体)
我怎么能提及一种方法,其中含有在Ruby援引的论据?
原标题:How can I get a reference to a method that contains the arguments used for invocations, in Ruby?
  • 时间:2009-11-10 14:14:13
  •  标签:

考虑到这一法典:

a = {1=>2}
m = a.method(:[])

我知道,我现在可以使用:

value = m.call(1)

返回 2. 事情是,我需要改变,以便我能够把这种方法直接称作:

m.call()

它将把1号列为一个参数? 能够撰写诸如:

m = a.method(:[],1) # where the symbol is the method, and 1 will be the parameter it will be called with

这就是说,我要推迟执行我的发言稿中的某些部分,直到某些物体制造为止,我也想避免改写EVERYTHING,以使用lambdas。

最佳回答
问题回答

我确信,这样做有不止一种方式。

a = {1=>2}

class << a
  def fetch_what(key)
    Proc.new { self[key] }
  end
end

....

m = a.fetch_what(1)
m.call()  # -> 2

如同你一样,它应当把方法参数附在你重新使用的方法的标子上,并将方法作为实例变量加以利用。

简单令人满意:

  • Introduce new instance variables, one per method parameter.
  • Introduce new accessors for the instance variables.
  • Refactor the method to use the instance variables if the parameters are not supplied.
  • Refactor the calling code to set the instance variables through the accessors, at some point prior to the method call.
  • Refactor the calling code to pass no parameters in the method call.

As an example, refactor calling code like this:

widget = Widget.new
assembly_method = widget.method(:assemble)
# Time passes...
assembly_method.call(:electric, :smooth)

to work like this:

widget = Widget.new
widget.frombulator = :electric
widget.jazzifier = :smooth
assembly_method = widget.method(:assemble)
# Time passes...
assembly_method.call

它不带有性别色彩,而是会形成表达其意图的法典,奇怪的是,它会处理真正的问题,即你模式中缺少的东西。





相关问题