从参数调用类

时间:2015-07-28 13:45:05

标签: ruby

我有以下方法:

def parse_data(key:, type:)
  elements = self.xml_doc.css(key)
  return nil if elements.empty?
  element = elements.first
  return nil if element['resultType'] == NOT_AVAILABLE
  type(element.content)
end

这样调用方法:

def cash_collection
  parse_data(key: "item[@alias='COLLECTIONDAYS']", type: Float)
end

问题是在Ruby中你有类Float并且你有一个名为Float()的方法。我想要实现的是我的parse_data方法的最后一行模仿了以下行为,但是以一种聪明的方式,所以我不必为每个类输入它:

Float(element.content) if type.is_a?(Float)
Integer(element.content) if type.is_a?(Integer)

有没有办法在我将类Float作为type:参数传递时,代码知道它需要调用Float()而不必显式写入它?我正在考虑一些反思方法或其他东西。

更新 目前我通过在我的数据上使用.send方法解决了这个问题,只是将正确的方法作为参数传递,但如果没有办法解决这个问题,我将采用这种方法。

2 个答案:

答案 0 :(得分:1)

由于Float作为常量(类)而Float作为方法(如在Float(...)中)是不同的东西,因此没有内置方法可以将其中一个转换为另一个。它们拼写相同是巧合。

了解这一点,你可以通过字符串。例如,使用:

Float.name # => "Float"

代码可能是:

def parse_data(key:, type:)
  ...
  send(type.name, ...)
end

def cash_collection
  parse_data(key: ..., type: Float)
end

答案 1 :(得分:1)

有一个常量Float(类)和一个全局方法Float()

defined? Float   #=> "constant"
defined? Float() #=> "method"

这些是不同的东西,你不能在常量上调用方法:

type = Float
type() #=> NoMethodError: undefined method `type' for main:Object

您可以使用符号调用全局方法:

Kernel.public_send(:Float, '1.2')
#=> 1.2

或通过班级名称:

Kernel.public_send(Float.name, '1.2')
#=> 1.2

请注意,这仅适用于具有相同名称的全局方法的类/常量。