按类变量进行转换

时间:2014-07-10 03:32:16

标签: ruby casting

我可以通过以下方式将字符串转换为浮动:

Float("1")

现在我有了这个:

f = Float

如何使用f将字符串转换为浮动?

被修改

我很抱歉不清楚。

以下是我的情景:

我正在使用Redis DB,通过gem redis-rb。基本上redis-db将值存储为字符串。当我将数据库中的值映射到我的对象时,我希望将它们转换为一些原始类型以便于使用。

所以我用这个:

require 'ostruct'

class Person < OpenStruct

    MAP = { :name => String, :age => Fixnum }

    ##
    # This reads data from DB, and converts them to some "primitive" types
    # for easy use.
    #
    def read
        MAP.each_pair do |sym, cls|
            # read data as string from DB, via key `sym.to_s`
            s = ...
            # now I have `cls`, how can I "cast" `s` to `cls`?
            self[sym] = ???

            # I know I can "iterate" all types by this:
            #
            # if cls.is_a? Float
            #     self[sym] = s.to_f
            # elsif cls.is_a? Fixnum
            #     self[sym] = s.to_i
            # ...
            #
            # But in Python I can just cast `s` to `cls` in one line...
            # So I wonder if there is some way to cast `s` to `cls` in Ruby?
        end
    end # read

end # Person

说“易于使用”,我的意思是我想:

p = Person.new
p.read
# I want to access `age` as an integer, not a string
if p.age +-*/ ...

2 个答案:

答案 0 :(得分:2)

您无法使用f来执行此操作。 Float中的Float("1")是一种方法。 Float中的f = Float是一个类(对象)。它们是不同的东西。

答案 1 :(得分:0)

我从你的问题中理解你想要的东西:

result = '1'.to_f  #outputs => 1.0

然后是字符串:

result.to_s  #outputs => "1.0"

你也可以一步到位:

'1'.to_f.to_s #outputs => "1.0"

有关字符串和红宝石的更多信息,请参阅ruby doc