动态创建给定类的数字

时间:2015-06-30 00:04:08

标签: ruby

给定字符串'123',我可以创建FloatInteger

x = Float('123.45')
y = Integer('123')

作为动态类型的练习,我希望扩展Numeric这个顶级数字类,其方法是将数字转换为字符串,将其反转,然后再返回其原始类型。< / p>

这将允许我这样做:

x = (123).reverse
// x == 321

或者这个:

y = (54.321).reverse
// y == 123.45

一个实现如下所示:(这可以正常工作)

class Numeric
  def reverse
    str = self.to_s.reverse

    if self.is_a?(Float)
      return Float(str) # or str.to_f
    elsif self.is_a?(Integer)
      return Integer(str) # or str.to_i
    end
  end
end

但我想动态创建结果而不是检查类型列表。我尝试使用Class.new()

class Numeric
  def reverse
    str = self.to_s.reverse
    self.class.new(str)
  end
end

我认为这可行,因为我可以致电Float('123.45')Integer('123')。但是,我收到了这些错误:

irb(main):047:0> (54.321).reverse
NoMethodError: undefined method `new' for Float:Class
    from (irb):44:in `reverse'
    from (irb):47
    from /Users/aaron/.rvm/rubies/ruby-2.1.1/bin/irb:11:in `<main>'
irb(main):048:0> (123).reverse
NoMethodError: undefined method `new' for Fixnum:Class
    from (irb):44:in `reverse'
    from (irb):48
    from /Users/aaron/.rvm/rubies/ruby-2.1.1/bin/irb:11:in `<main>'

所以我有两个问题:

  • 如果Float('123.45')Integer('123')未实施new,该如何运作?
  • 如何在没有任何条件的情况下实施Numeric.reverse()

我知道还有其他情况不会起作用(如负数),但我并不关心这些问题。

1 个答案:

答案 0 :(得分:1)

  1. 如果Float('123.45')Integer('123')未实现新功能,该如何运作?

    他们分别调用Kernel方法Kernel::FloatKernel::Integer,更多信息here

  2. 如何在没有任何条件的情况下实施Numeric.reverse()

    像这样:

    class Numeric
      def reverse
        str = self.to_s.reverse
        method(self.class.to_s).call(str)
      end
    end
    

    method方法将字符串或符号转换为方法,然后可以使用call调用该方法并将所需的字符串传递给它。

    示例:method((123.2).class.to_s).call('321') # => 321.0