如何才能写一个类在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