Ruby定义运算符过程

时间:2011-04-05 17:45:45

标签: ruby

如何在ruby中编写一个具有我可以调用的过程的类:

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

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

这比:

更好
c = a.multiply(b)
...

感谢

4 个答案:

答案 0 :(得分:5)

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

>  class String
..   def -@
..     self.swapcase
..   end
.. end #=> nil
>> -"foo" #=> "FOO"
>> -"FOO" #=> "foo"

答案 1 :(得分: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

答案 2 :(得分:4)

只需创建名称为您要重载的运算符的方法,例如:

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

答案 3 :(得分:3)

在Ruby中,*运算符(以及其他此类运算符)实际上只是调用与运算符同名的方法。因此,要覆盖*,您可以执行以下操作:

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

您可以对其他运营商使用类似的技术,例如/+。 (请注意,您无法在Ruby中创建自己的运算符。)