Ruby:像一个数字一样对待一个类?

时间:2012-05-17 03:34:16

标签: ruby

我想在做数学时将罗马数字与阿拉伯数字混合。

我会为每个符号定义一些类

class I
end

class V
end

class X
end

现在我希望能够说出像

这样的内容
5 + V   # results in 10
X + 12  # results in 22

但我不知道从哪里开始。
我必须定义一个方法,告诉ruby 5 + V如何工作,给每个类一个值,当我说

I

我应该得到值1。

我应该使用哪种方法来将X视为数字10?

2 个答案:

答案 0 :(得分:6)

对我来说似乎很简单:

V = 5
V + 1 #=> 6

如果您想将结果显示为罗马数字,我会使用Fixnum方法扩展to_roman类:

class Fixnum
  def to_roman
    # I'll leave the implementation up to you
  end
end

你可以这样做:

10.to_roman #=> "X"

答案 1 :(得分:0)

您可以覆盖罗马班级中的+运算符,因此适用于X + 12,但不适用于12 + X.请参阅此博文:http://strugglingwithruby.blogspot.ca/2010/04/operator-overloading.html了解更多信息

  

该定义不是可交换的,即试图做3 + a会失败。要使其工作,您需要覆盖Integer中的添加方法 - 我认为这是一个坏主意。