Ruby动态转换/确保类

时间:2013-11-23 19:50:43

标签: ruby

在ruby中,对于许多类,您可以确保拥有正确的类,或者在某些情况下使用类似于以下代码的类转换类。

Hash({a: 3}) #=> {a: 3}
Hash(3) #=> TypeError

但是,如果您从地图或其他内容中获取类,则此方法无效。例如,以下代码引发语法错误

type_map = {class: Hash}
type_map[:class]({a: 3}) #=> Unexpected '(', expecting ')'

就像这样:

klass = Hash
klass({a: 3}) #=> NoMethodError: undefined method klass for main:Object

有人知道这样做的方法吗?

1 个答案:

答案 0 :(得分:5)

Kernel模块中,有ArrayHash方法分别创建数组和哈希值。

当您输入Hash({a: 3})时,您正在调用此方法,而不是Hash类。

在你的例子中,事情发生了一些变化:

klass = Hash # Reference to a Hash class
klass({a: 3}) # try to access a method a method that doesn't exist in hash class

您可以将示例更改为:

method = Kernel.method(:Hash)
method.call({a: 3})