2013-02-27 6 views
0

В процессе понимания ruby ​​я пытался переопределить значение «+» со значением аргумента по умолчанию. Что-то вроде этого.Переопределить метод «+»

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

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

Теперь

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

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

Является ли это из-за приоритета операторов?

+0

'x.send (: +)' покажет, что вы ожидаете. Я считаю, что интерпретатор ожидает метод или переменную после +. – Gazler

+0

Gazler, фантастический. send() работает как ожидалось. Теперь я узнал о реальном использовании отправки. – Bala

+0

@Bala отправить. Все способ отправка ... – texasbruce

ответ

2

IRB является разбором + и ожидает второй параметр для бинарной операции. Если вы предоставите скобки, она работает правильно:

x.+() #=> Received: 10 
4

Проблема с IRB (похоже, что он не обрабатывает такие случаи). Если вы создаете отдельный файл .RB и запустить его, вы получите ожидаемый результат:

Received: 5 
Received: 88 
Received: 10 
1

IRb использует другой парсер, чем Ruby. Таким образом, в некоторых странных угловых случаях IRb может анализировать код иначе, чем Ruby. Если вы хотите узнать, действительно ли что-то действительно Ruby или нет, вы должны спросить Ruby not IRb.

Причина этого в том, что Ruby всегда анализирует весь файл за раз, поэтому он всегда знает, когда заканчивается выражение. IRb, с другой стороны, должен «гадать» каждый раз, когда вы нажимаете ENTER, хотите ли вы просто продолжить выражение в новой строке или хотите ли вы оценить выражение as-is. В результате IRb не может просто использовать парсер Ruby, он должен иметь свой собственный. И грамматика Ruby настолько сложна, что писать собственный парсер действительно очень сложно. Вот почему такие ошибки и угловые случаи появляются время от времени даже в части программного обеспечения, столь же старой и широко используемой как IRb.

Смежные вопросы