如何获取原始数字? 例如,当我输入:
r = Rational(2, 10)
# (1/5)
2和10将更改为1和5:
r.numerator # 1
r.denominator # 5
我如何获得2& 10来自Rational类的实例(r
)?
我修补了Rational类并创建了新方法(Rational_o
):
def Rational_o *args
x, y = args
r = Rational *args
r.x = x
r.y = y
r
end
class Rational
attr_accessor :x, :y
end
它有效,但有内置方法或变量,其中原始x&是存储?
答案 0 :(得分:4)
不,没有。减少是规范有理数的基本和常用方法。为什么有理数会保留原始分子和分母?这没有意义。
您的问题就像是问“由"foo" + "bar"
创建的字符串(成为"foobar"
)是否保留原始子字符串"foo"
和"bar"
?它们存储在哪里?”
如果你真的想保留原始数字,那么理性数字就不是你想要的,而继承Rational
并不是正确的方法。你应该使用一个包含一对数字的数组。
答案 1 :(得分:3)
有理数在初始化时得到规范化,因此您无法知道哪些数字作为原始参数给出。您也不能将Rational
子类化为自己的初始化程序,并且monkeypatching正如您所做的那样,并不是实现您想要实现的目标的最佳方式(我认为您知道)。
您可以使用Rational
创建一个代理BasicObject
,保留原始参数,不会影响原始Rational
类的正常操作
class RationalWithArgumentStore < BasicObject
attr_accessor :original_arguments, :rational
def initialize *args
@original_arguments = args
@rational = Rational *args
end
# Basic Object is a basic object, but defines ==
# so let's overwrite it to route to rational
def == other
@rational == other
end
# Route all unknown method calls to rational
def method_missing meth, *args, &block
@rational.send meth, *args, &block
end
end
def RationalWithArgumentStore(*args)
RationalWithArgumentStore.new(*args)
end
所以现在你可以做到
my_rational = RationalWithArgumentStore(2,10)
my_rational.original_arguments #=> [2, 10]
#use it like a normal rational
my_rational * 3
my_rational.truncate
答案 2 :(得分:2)
不,没有这样的内置私有或公共方法能够做你想做的事。
如果你真的想将原始数字存储在实例方法中,那么你的猴子补丁肯定是其中一种方法。
实际上,方法Rational(a,b)
是在类Rational
之外定义的实例方法,类似于Array()
和String()
方法。