2011-04-05 80 views
3

如何才能写一个类在Ruby中,有一个程序,我可以这样调用:红宝石定义操作过程

a = MyObj.new() 
b = MyObj.new() 

c = a * b 
d = a/b 
e = a - b 

这是不是更好:

c = a.multiply(b) 
... 

感谢

回答

4
class Foo 
    attr_accessor :value 
    def initialize(v) 
    self.value = v 
    end 
    def *(other) 
    self.class.new(value*other.value) 
    end 
end 

a = Foo.new(6) 
#=> #<Foo:0x29c9920 @value=6> 

b = Foo.new(7) 
#=> #<Foo:0x29c9900 @value=7> 

c = a*b 
#=> #<Foo:0x29c98e0 @value=42> 

您可以在此找到可定义为方法的运算符列表:
http://phrogz.net/ProgrammingRuby/language.html#operatorexpressions

4

只需创建一个名称是您要重载操作方法,例如:

class MyObj 
    def/rhs 
    # do something and return the result 
    end 
    def * rhs 
    # do something and return the result 
    end 
end 
3

在Ruby中,*运营商(和其他类似运营商),实际上只是调用具有相同的方法作为运营商的名称。因此,要覆盖*,你可以做这样的事情:

class MyObj 
    def *(obj) 
    # Do some multiplication stuff 
    true # Return whatever you want 
    end 
end 

您可以使用类似的技术用于其它运营商,像/+。 (注意,尽管你不能在Ruby中创建自己的操作符)。

5

你已经得到了关于如何定义二元运算符的答案,所以就像你可以定义一元运算符-(比如for负数)。

> class String 
.. def [email protected] 
..  self.swapcase 
.. end 
.. end #=> nil 
>> -"foo" #=> "FOO" 
>> -"FOO" #=> "foo" 
+0

注意:这只适用于已经存在的操作符。所以这是有效的,因为' - '已经被定义为Ruby,但是不适用于String。你并没有真正定义新的操作符,只是将它们扩展到新的类。 – 2014-12-03 03:43:56

+0

因为Ruby不支持自定义运算符,所以给出了这个。 OP只要求标准算术运算符,所以应该没问题。 – 2014-12-03 05:28:01

+0

噢,不要误会我的意思,只是为其他人澄清,因为我发现实施有趣 – 2014-12-03 20:40:44