Процедура, определяющая оператор Ruby - PullRequest
5 голосов
/ 05 апреля 2011

как написать класс в ruby, в котором есть процедуры, которые я могу вызывать так:

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

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

это лучше, чем:

c = a.multiply(b)
...

спасибо

Ответы [ 4 ]

5 голосов
/ 05 апреля 2011

Вы уже получили ответ о том, как определить бинарные операторы, так же, как небольшое дополнение, вот как вы можете определить унарные - (как для отрицательных чисел).

>  class String
..   def -@
..     self.swapcase
..   end
.. end #=> nil
>> -"foo" #=> "FOO"
>> -"FOO" #=> "foo"
4 голосов
/ 05 апреля 2011

Просто создайте методы, именем которых является оператор, который вы хотите перегрузить, например:

class MyObj
   def / rhs
     # do something and return the result
   end
   def * rhs
     # do something and return the result
   end
end
4 голосов
/ 05 апреля 2011
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

3 голосов
/ 05 апреля 2011

В Ruby оператор * (и другие подобные операторы) на самом деле просто вызывают метод с тем же именем, что и оператор. Таким образом, чтобы переопределить *, вы можете сделать что-то вроде этого:

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

Вы можете использовать аналогичную технику для других операторов, например / или +. (Обратите внимание, что вы не можете создавать свои собственные операторы в Ruby.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...