如何才能寫一個類在Ruby中,有一個程序,我可以這樣調用:紅寶石定義操作過程
a = MyObj.new()
b = MyObj.new()
c = a * b
d = a/b
e = a - b
這是不是更好:
c = a.multiply(b)
...
感謝
如何才能寫一個類在Ruby中,有一個程序,我可以這樣調用:紅寶石定義操作過程
a = MyObj.new()
b = MyObj.new()
c = a * b
d = a/b
e = a - b
這是不是更好:
c = a.multiply(b)
...
感謝
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
只需創建一個名稱是您要重載操作方法,例如:
class MyObj
def/rhs
# do something and return the result
end
def * rhs
# do something and return the result
end
end
在Ruby中,*
運營商(和其他類似運營商),實際上只是調用具有相同的方法作爲運營商的名稱。因此,要覆蓋*
,你可以做這樣的事情:
class MyObj
def *(obj)
# Do some multiplication stuff
true # Return whatever you want
end
end
您可以使用類似的技術用於其它運營商,像/
或+
。 (注意,儘管你不能在Ruby中創建自己的操作符)。
你已經得到了關於如何定義二元運算符的答案,所以就像你可以定義一元運算符-
(比如for負數)。
> class String
.. def [email protected]
.. self.swapcase
.. end
.. end #=> nil
>> -"foo" #=> "FOO"
>> -"FOO" #=> "foo"
注意:這隻適用於已經存在的操作符。所以這是有效的,因爲' - '已經被定義爲Ruby,但是不適用於String。你並沒有真正定義新的操作符,只是將它們擴展到新的類。 – 2014-12-03 03:43:56
因爲Ruby不支持自定義運算符,所以給出了這個。 OP只要求標準算術運算符,所以應該沒問題。 – 2014-12-03 05:28:01
噢,不要誤會我的意思,只是爲其他人澄清,因爲我發現實施有趣 – 2014-12-03 20:40:44