Bala
Bala

Reputation: 11274

Override '+' method

In the process of understanding ruby, I was trying to overide '+' with a default argument value. Something like this.

class C
  def something(a = 5)
    puts "Received: #{a}"
  end

  def +(b = 10)
    puts "Received: #{b}"
  end
end

Now

x = C.new
x.something #=> Received: 5
x.something(88) #=> Received: 88

x.+ #=> IRB shows ? whereas I was expecting an output 'Received: 10'

Is this because of operator precedence?

Upvotes: 0

Views: 80

Answers (3)

Jörg W Mittag
Jörg W Mittag

Reputation: 369624

IRb uses a different parser than Ruby does. So, in some weird corner cases, IRb may parse code differently than Ruby. If you want to see whether something is valid Ruby or not, you should ask Ruby not IRb.

The reason for this is mainly that Ruby always parses the entire file at once, so it always knows when an expression ends. IRb on the other hand, has to "guess" every time when you press ENTER whether you simply want to continue the expression on a new line or whether you wanted to evaluate the expression as-is. As a result, IRb cannot just use the Ruby parser, it needs to have its own. And Ruby's grammar is so complex that writing your own parser is really really hard. That's why such bugs and corner cases pop up from time to time even in a piece of software as old and as widely used as IRb.

Upvotes: 1

vacawama
vacawama

Reputation: 154721

IRB is parsing the + and expecting a second parameter for the binary operation. If you provide parenthesis it works correctly:

x.+()  #=> Received: 10

Upvotes: 2

valodzka
valodzka

Reputation: 5805

Problem with IRB (look like it doesn't handle such cases). If you create separate .rb file and run it you will get expected output:

Received: 5
Received: 88
Received: 10

Upvotes: 4

Related Questions