有没有更好的方法来将特定代码作为方法包装器(在Ruby中)?

时间:2013-12-20 20:16:26

标签: ruby

这是我今天早些时候提出的一个问题的后续问题。现在我有了它的工作,我想知道是否有任何我应该关注的事情。

我的目的是基本上从c ++库中包装一些类。 我知道我可以使用Forwardable或其中一个delagate类,但我也想尝试使用Rdoc并在各种类中的很多方法中添加hash参数。

所以这基本上就是我所拥有的:

对于我正在包装的每个班级,我都有这样的方法。 method_wrapper接受一个字符串,该字符串是要调用类方法的类的名称,或者是用于调用实例方法的唯一实例变量的字符串表示形式,以及要调用的方法的名称。然后它执行eval以实际调用该方法。

 def initialize(*args)
    hash_keys = [ ]
    return_value = method_wrapper("Wvwaves::WvPointFilter", "new", hash_keys, args)
    @component = return_value
  end

  def add_point(*args)
    hash_keys = [ ]
    return_value = method_wrapper("@component", "addPoint", hash_keys, args)
  end

这是method_wrapper方法。我的想法是我可以添加散列键控参数并将方法重命名为更像ruby的东西,并为rdoc添加新的方法和注释。我认为这是一个好主意,因为我只有一个函数,method_wrapper,我调用所有类中的所有方法。

  def method_wrapper(receiver, method, hash_keys,  args=[])
   if args.length == 0
      #puts "calling without args"
      return_value = eval "#{receiver}.send( :#{method.to_sym} )"
   else
      if args[0].class == Hash
        method_args = Array.new
        hash_args = args[0]
        hash_keys.each do |key|
          arg_value = hash_args[key]
          method_args << arg_value if arg_value
        end
        #puts "calling with hash args #{method_args}"
        return_value = eval "#{receiver}.send( :#{method.to_sym}, *method_args)"
      else
        #puts "calling with args"
        return_value = eval "#{receiver}.send( :#{method.to_sym}, *args)"
      end
    end
    return return_value
  end
end

这种方法有什么特别糟糕的吗?

1 个答案:

答案 0 :(得分:0)

以下是同一方法的简化版

 def method_wrapper(receiver, method, hash_keys,  args=[])
    return receiver.send(method.to_sym) if args.empty?
    method_args = args[0].is_a?(Hash) ? args[0].values.compact : args 
    return_value = receiver.send(method.to_sym, *method_args)
    return return_value
 end
P.S:未经测试。可能存在一些语法错误。但你会明白这个想法