2011-04-05 97 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