2

我想像这样设置一个哈希:

{:a => Float, :b => String}

这样我就可以将它用作针对另一个哈希的“类型转换”过滤器。例如:

def parse_hash(input_hash)
  output = { :a => Float, :b => String }
  input_hash.each do |k,v|
    input_hash[k] = output[k](v)
  end
end

这个想法是,你可以这样做:

Float("123") #=> 123.0

但不幸的是,你不能这样做:

f = Float
f("123") #=> NoMethodError: undefined method `f' for main:Object

...这意味着我要使用的哈希解析方法不起作用。

所以,如果我在变量中有一个类的引用,有没有办法从那里自动强制一个值到那个类?

4

3 回答 3

9

Float哪个是类和Float哪个是方法之间存在细微差别。Ruby 解释器将在语法级别上进行区分,这取决于您如何使用它。Float("1.0")是方法的触发器,原样Float "1.0",但a = Float被解释为类。

您需要专门捕获该方法:

output = {
  a: method(:Float),
  b: method(:String)
}

稍后,调用它:

output[:a].call('1.7')
# => 1.7
于 2013-09-27T15:44:09.297 回答
1

作为 tadman 答案的构建,以下是所有内核方法,它们是方法名称不大写的约定的例外:

2.0.0p247 :021 > Kernel.methods.grep /(^[A-Z][a-z]+)+$/
 => [:Integer, :Float, :String, :Array, :Hash, :Rational, :Complex]

更新:修改了搜索以适应驼峰式大小写,同时仍避免全大写。排除名称中包含任何非字母字符的方法,无论好坏。另请注意,框架可能会添加到此列表中。在这两个方面都向 Stefan 点头。

于 2013-09-27T16:08:21.417 回答
0

正如 tadman 指出的那样,您在类和方法之间的混淆是一个问题,但您的代码Float的另一个String问题FloatString

v = ...

在散列循环内没有对散列做任何事情。如果你想改变哈希值,你必须这样做:

input_hash[k] = ...
于 2013-09-27T16:02:50.397 回答