给定字符串'123'
,我可以创建Float
或Integer
:
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()
?我知道还有其他情况不会起作用(如负数),但我并不关心这些问题。
答案 0 :(得分:1)
如果Float('123.45')
或Integer('123')
未实现新功能,该如何运作?
他们分别调用Kernel
方法Kernel::Float
和Kernel::Integer
,更多信息here
如何在没有任何条件的情况下实施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