2013-03-26 5 views
2

Я хотел бы иметь возможность определять пользовательские операторы. Это возможно? Например, сделать a***b что-то значит.Определение пользовательских операторов в ruby ​​

Возможно ли также обезвреживание патча существующих операторов? Например, чтобы a**b всегда возвращал поплавок?

ответ

3

Да, вы можете. Например:

class Fixnum 
    def **(x) 
    self.*(x)*1.0 
    end 
end 

5**4 #==> 20.0 
2

Пользовательские операторы? Если вы не хотите взломать C parser (или парсер Java для JRuby или ...). OTOH, операторы в основном представляют собой синтаксический сахар для методов, и вам разрешено определять все методы, которые вы хотите.

Поскольку многие операторы (but not all) - это скрытые методы, вы можете обезвредить реализации существующих операторов столько, сколько захотите. Вам нужно будет отследить все числовые классы, которые определяют свою собственную реализацию **, и исправить все из них; обратите внимание, что вам нужно будет покрыть Rational, Bignum, Complex, ... от ядра, а также от таких вещей, как BigDecimal из стандартной библиотеки. Я бы настоятельно рекомендовал против этого, вы просто настроились на боль и страдания; например, что бы вы сделали с BigDecimal#**, когда результат не поместился в Float? Как насчет Complex#**? Если вам нужно Float s для чего-то, сделайте его явным с вызовом to_f.

+1

«Поскольку операторы - это просто маскирующие методы», ну, некоторые операторы *, но не все, а некоторые иногда (например, '='). [Таблица 18.4 в Пикаксе] (http://phrogz.net/ProgrammingRuby/language.html#table_18.4) является хорошей ссылкой. –

+0

@AndrewMarshall: Это хороший момент. Я думаю, что я мысленно разделял операторов на «операторов» и «языковые функции», даже не осознавая этого. –

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