我有以下方法:
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
方法解决了这个问题,只是将正确的方法作为参数传递,但如果没有办法解决这个问题,我将采用这种方法。
答案 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)
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
请注意,这仅适用于具有相同名称的全局方法的类/常量。