# How to call operator as function

**URL:** <https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352>\
**Category:** Ruby\
**Created:** [November 15, 2008, 11:59am UTC](https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352 "2008-11-15T11:59:59Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [November 15, 2008, 11:59am UTC](https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352/1 "2008-11-15T11:59:59Z")

</div>

Hi \*,

could you help me please ? I’m trying to write a code where I could  
have  
operators’ functions as values of hash and executing them in way like  
this  
(formal code):

#=============================  
operators = { “+” =\> Fixnum.+,  
“-” =\> Fixnum.-,  
“++” =\> Myclass.++}

op = “+”

result = operatorsop if left.class==Fixnum and  
right.class==Fixnum  
#============================

is it possible ? Thanks,

Cheers,

V.

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [November 15, 2008, 12:09pm UTC](https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352/2 "2008-11-15T12:09:22Z")

</div>

On 2008.11.15., at 11:56, Vladimir F. wrote:

> ```
> "-" => Fixnum.-,
> "++" => Myclass.++}
> 
> ```
> 
> op = “+”
> 
> result = operatorsop if left.class==Fixnum and  
> right.class==Fixnum  
> #============================

++ is not supported by Ruby 🙂

I would do

1.send ‘+’.to\_sym, 2

unless you want to use some esoteric operator mappings, you don’t need  
the hash.  
Fixnum.+ doesn’t make that much sense because of Ruby’s duck typing  
(and why would you want to restrict yourself to work with just certain  
objects?)

p.s.: dobre tu vidiet matfyzaka 🙂

Cheers,  
Peter

* * *

[http://www.rubyrailways.com](http://www.rubyrailways.com)

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [November 15, 2008, 12:10pm UTC](https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352/3 "2008-11-15T12:10:32Z")

</div>

2008/11/15 Vladimir F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> op = “+”
> 
> result = operatorsop if left.class==Fixnum and right.class==Fixnum  
> #============================
> 
> is it possible ? Thanks,

Use send, if all operators are binary:

left.send(:+, right)  
left.send(:-, right)

etc.

Stefan

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [November 15, 2008, 12:11pm UTC](https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352/4 "2008-11-15T12:11:08Z")

</div>

Vladimir F. wrote:

> operators = { “+” =\> Fixnum.+,  
> “-” =\> Fixnum.-,

“+” =\> Fixnum.instance\_method(:+),  
“-” =\> Fixnum.instance\_method(:-),

> ```
> "++" => Myclass.++}
> 
> ```

There is no ++ operator in ruby and you can’t define one.

> op = “+”
> 
> result = operatorsop if left.class==Fixnum and  
> right.class==Fixnum

result = operators[op].bind(left).call(right) if left.is\_a?(Fixnum) and  
right.is\_a?(Fixnum)

Or you skip the whole thing with the hash and just do:

op = “+”  
result = left.send(op, right)

HTH,  
Sebastian

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [November 15, 2008, 12:19pm UTC](https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352/5 "2008-11-15T12:19:19Z")

</div>

On Sat, Nov 15, 2008 at 08:07:17PM +0900, Sebastian H. wrote:

> Vladimir F. wrote:
> 
> > operators = { “+” =\> Fixnum.+,  
> > “-” =\> Fixnum.-,
> 
> “+” =\> Fixnum.instance\_method(:+),  
> “-” =\> Fixnum.instance\_method(:-),
> 
> > ? ? ? ? ? ? ? “++” =\> Myclass.++}
> 
> There is no ++ operator in ruby and you can’t define one.

it’s Myclasses ++ operator

> ICQ: 205544826

What I’m trying to do is Domain specific language class, for which I  
could set  
up names of variables, functions and operators and then parse and  
execute  
a string (f.e. “( a + ( b \* c ) + sin ( d ) )”, where  
variables could be hash { “a” =\> 1, “b” =\> 2, “c” =\> 3, “d” =\> 4} and  
functions could be hash again so naturaly I asked whether it is possible  
to  
make it with operators). I tryied to use som ruby’s or irb’s native  
DSL but withouth success.

V.

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [November 15, 2008, 12:24pm UTC](https://www.ruby-forum.com/t/how-to-call-operator-as-function/153352/6 "2008-11-15T12:24:36Z")

</div>

Vladimir F. wrote:

> it’s Myclasses ++ operator

You can’t define ++ on any class. You just can’t. If the parser sees ++  
anywhere it interprets it as two calls to +@ or one call to + and one to  
+@.

HTH,  
Sebastian
