2014-09-26 2 views
-2

Я пытаюсь переопределить операцию ==, как показано на рисунке here. Я создал ==, как так:Переопределение == Оператор не работает и выходит из программы

class Point 
    def ==(g) 
    p'Never reaches here' 
    if @x==g.grid 
     true 
    else 
     false 
    end 
    end 
end 

Я вызываю метод, как так:

def home? (gridPoint,point) 
    if point==gridPoint 
    do something 
    end 

При запуске приложения, "Never reaches here" никогда не печатается, а приложение пропускает оставшуюся часть кода и выходов ,

Если я напечатаю gridPoint и Point прямо перед ==, я вижу, что они оба. Почему программа, похоже, никогда не вводила метод ==?

Я пробовал point.==(gridPoint). Это также не работает, а также не позволяет цели очистить код.

Может ли кто-нибудь мне помочь?

+1

Мда. Кажется, что это нормально для меня. – Schylar

+1

Работаю также и для меня. Класс 'Point' должен быть заглавным, не так ли? Возможно, это ошибка в 'gridPoint' или' point', что они, возможно, не являются экземплярами класса, который вы объявили. – jayelm

+1

Я думаю, что я скучаю. Как вы, ребята, можете сказать, что это работает для вас, если код не является неполным? @Bawn, не могли бы вы обновить свой вопрос некоторым кодом, который позволяет воспроизвести ошибку - откуда происходит '@ x'? Что такое метод 'grid'? Что такое 'gridPoint' и как он отличается от формы' Point'? – BroiSatse

ответ

-2

Я думаю, что у меня есть несколько предложений, почему ваш точный код не работает

  1. имен классов всегда должна быть постоянными. Это означает, что вы должны загладить первое письмо!
  2. Вам необходимо объявить свой метод == как метод класса, а не метод экземпляра.
  3. Наряду с № 2 вам нужно вызвать его, используя имя класса не из экземпляра объектов

class Point

 attr_accessor :x 

     def initialize(string) 
     @x == string 
     end 

     def self.== (g) 
      p'Never reaches here' 
      @x==(g) ? true : false 
     end 

     def home? (gridpoint, point) 
     Point == (gridpoint) 
     end 
    end 

    n = Point.new("Schylar") 
    puts n.home?("Schylar","Schylar") 
+1

Нет, я не согласен с 2. и 3., что разрушает объектно-ориентированный аспект метода equals. '==' должен работать отлично, как метод экземпляра. Код, который вы написали выше, сильно отличается от того, что хочет OP, и имеет несколько особенностей: почему существует аргумент 'point' для' home? '? – jayelm

+0

Я не согласен с утверждением, что он разрушает OO-аспект, но, пожалуйста, напишите свою версию, которая работает, когда написана как переменная экземпляра. – Schylar

+0

Хм, посмотрев конкретную реализацию OP '==', я вижу, откуда вы, но это действительно не правильное использование '==' в первую очередь. Я не уверен, что не так с кодом OP, на самом деле недостаточно информации для диагностики проблемы. – jayelm

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