Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: перегрузка оператора * в Ruby  (Прочитано 17291 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BlackThornGreed
Гость
« : 25-05-2010 00:04 » 

приветствую всех кто зашел в эту тему.

требуется помощь в ruby.

взял я себе задание, начал писать программу и до какого то момента все шло прекрасно, но потом как это всегда бывает начались проблемы...
суть вот в чем:
требуется создать класс, и переопределить для него операторы + - * / .

этих вещей я не разу не делал, и представляю себе довольно смутно как делать.
мне бы очень помог небольшой пример с пояснениями, чтобы я мог сделать по аналогии и разобраться.

прочитал пару книг о программировании на Ruby, но суть оформления класса и перегрузки операторов не смог понять.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-05-2010 01:06 » 

http://www.brpreiss.com/books/opus8/html/page595.html
Точно так же, как и другие методы класса.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
BlackThornGreed
Гость
« Ответ #2 : 25-05-2010 07:36 » 

RXL, спасибо добрый человек))
вот только ошибки в этом примере были.. пропущенные скобки и лишние пробелы после родительских конструкций.

Код:
class Complex
  def +(c)
    Complex.new(real-c.real, imag+c.imag)
  end
  
  def -(c)
    Complex.new(real-c.real, imag-c.imag)
  end
  
  def *(c)
    Complex.new((real*c.real) - (imag*c.imag), (real*c.imag) + (imag*c.real))
  end
  
  def /(c)
    denom = ((c.real*c.real) - (c.imag*c.imag)).to_f
    Complex.new(((real*c.real) - (imag*c.imag)) / denom, ((imag*c.real) - (real*c.imag)) / denom)
  end

end

вот исправленный вариант  Класс!


все таки Ruby тоже требуется указывать в некоторых случаях скобками порядок действий, хоть () и опциональны.

а что обозначает imag (второй элемент упорядоченной пары в представлении комплексного числа?) ?
« Последнее редактирование: 30-05-2010 14:59 от RXL » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 25-05-2010 07:58 » 

Код:
  def +(c)
    Complex.new(real-c.real, imag+c.imag)
  end

а по-моему, тут ещё ошибка Улыбаюсь


а что обозначает imag (второй элемент упорядоченной пары в представлении комплексного числа?) ?
real - действительная часть
imagine - мнимая часть
« Последнее редактирование: 25-05-2010 08:00 от Алексей1153++ » Записан

baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #4 : 25-05-2010 08:08 » 

На мой взгляд, везде должны быть @real и @imag , поскольку это объекты экземпляра класса.

Алексей1153++, а ты какую ошибку имел в виду?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
BlackThornGreed
Гость
« Ответ #5 : 25-05-2010 08:10 » 

Алексей1153++, да тоже интересно в чем ошибка там.

baldr, спасибо ответил кратко но исчерпывающе
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 25-05-2010 08:13 » 

baldr, BlackThornGreed, мне всегда казалось, что при сложении векторов их составляющие тоже складываются Улыбаюсь
Записан

BlackThornGreed
Гость
« Ответ #7 : 25-05-2010 08:16 » 

Алексей1153++, да я тоже заметил только сейчас. благодарю за поправку и ответ.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 25-05-2010 08:18 » 

в делении тоже есть грабля - надо проверять denom на ноль (вернее, на почти ноль) или просто ловить исключение, если тут это можно делать. Если исключение возникло, сравнить знаки частей операндов и выставить "бесконечность" с нужным знаком для обоих частей результата
Записан

BlackThornGreed
Гость
« Ответ #9 : 25-05-2010 10:29 » 

а поясните почему при вызове на исполнение файла с этим классом мне в результате выдает строку
Код:
#<Complex:0x2b87b74>




Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #10 : 25-05-2010 10:38 » 

BlackThornGreed, а что ты ожидаешь?? Результат сложения типа A и типа A будет тип A (в твоем случае Complex).
Или тебя интересует почему при вызове puts выводится именно "#<Complex:0x2b87b74>"? Потому, что при вызове puts аргумент должен быть преобразован в строку для вывода - неявным вызовом функции to_s() (или to_str - не помню сейчас, извини). Если она не перегружена у тебя - то выведет только тип и id объекта по-умолчанию.

Если ты хочешь, чтобы у тебя при вызове "puts var" выводилось значение переменной - также перегрузи функцию to_s
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 25-05-2010 12:35 » 

Цитата: baldr
На мой взгляд, везде должны быть @real и @imag , поскольку это объекты экземпляра класса.
Либо self.real, self.imag, если есть акссессоры.

И вообще, где конструктор класса, где аксессоры к атрибутам?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #12 : 25-05-2010 13:11 » 

Dimka, ну это мы взялись просто искать ошибки в примере, который нашел RXL..
Конструктор, видимо, вот: http://www.brpreiss.com/books/opus8/html/page592.html
Аксессоры: http://www.brpreiss.com/books/opus8/html/page594.html
Подозреваю, что остальные методы раскиданы по всей книге..
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 26-05-2010 08:56 » 

Цитата: baldr
Подозреваю, что остальные методы раскиданы по всей книге..
Ужас. Тогда это не для начинающих. Они же собрать не сумеют.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
BlackThornGreed
Гость
« Ответ #14 : 29-05-2010 19:17 » 

Код:
class Interval

  attr_accessor:min
  attr_accessor:max
 
  def initialize(min,max)
  @min = min
  @max = max
  end

  def +(c)
    Interval.new(@min+c.min, @max+c.max)
  end
 
  def -(c)
    Interval.new(@min-c.min, @max-c.max)
  end
   
  def /(c)
    denom = ((c.min*c.min) - (c.max*c.max)).to_f
    Interval.new(((@min*c.min) - (@max*c.max)) / denom,
    ((@max*c.min) - (@min*c.max))/denom)
  end

  def *(c)
   if min && max>=0
   Interval.new((@min*c.min), (@max*c.max))
   end
   if min && max <=0
   interval.new((@min*c.min), (@max*c.min))
   end
  end
 
def to_s
    "min: "+@min.to_s+", max: "+@max.to_s
  end
end

min=gets.to_f
max=gets.to_f
c = Interval.new(min, max)
min=gets.to_f
max=gets.to_f
d = Interval.new(min, max)
puts r=(c+d).to_s

доработанный вариант.
вдруг такому же новичку как я пригодится. данный вариант складывает.

правда когда я хотел расширить умножение, чтобы считалось не по классической арифметике а по несколько иным правилам, перестали восприниматься отрицательные числа.

и еще вопрос кто может подсказать небольшой GUI Toolkit для Ruby, наподобии Shoes.
Shoes я попробовал, но там какието неполадки с упаковшиком в конечный формат rb2exe и он при каждом запуске начинает докачивать сам Shoes.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #15 : 30-05-2010 07:57 » 

BlackThornGreed, если под "GUI Toolkit" ты имеешь в виду среду разработки, то могу посоветовать, из своего опыта:
* Notepad++ - если нравится все делать в блокноте, но удобном блокноте Улыбаюсь . Есть подсветка синтаксиса и много горячих клавиш.
* jEdit - среда разработки для многих приложений. Для Ruby слабо заточена, но быстро развивается и легко модифицируется. Очень много плагинов.
* NetBeans - в последнее время пользюсь именно им для Ruby. Стабильнее и серьезнее, чем jEdit, ориентирован на много языков и, в том числе, хорошая поддержка Ruby. Умеет запукать и отлаживать скрипты.

Пробовал плагин для Eclipse, но он очень старый и ивой, на мой взгляд.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
BlackThornGreed
Гость
« Ответ #16 : 30-05-2010 10:56 » 

baldr, насчет удобного блокнота я пользуюсь Scite Улыбаюсь
а когда пробовал NetBeans то не смог собрать файл в конечный вариант, все время писал при нажатии Build сообщение 'gem task not exist' или что то на подобии..


говоря про NetBeans, мы оба имеем ввиду надстройку для него RubyInSteel/IronRuby?
« Последнее редактирование: 30-05-2010 14:59 от RXL » Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #17 : 30-05-2010 11:39 » 

BlackThornGreed, нет, говоря про NetBeans, я имею в виду его сборку для Ruby:
http://netbeans.org/downloads/start.html?platform=windows&lang=en&option=ruby&version=6.8
Сам Ruby стоит у меня отдельно.

Что касается IronRuby - то это вообще отдельная реализация - для .NET - и, насколько я знаю, для него есть плагин под VisualStudio.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
BlackThornGreed
Гость
« Ответ #18 : 30-05-2010 11:48 » 

baldr, да я спутал, пардон.

но суть все та же, в NetBeans при нажатии build пишет 'gem' task does not exist
что тут можно сделать?


оказывается нужно было обновить RubyGems.
« Последнее редактирование: 30-05-2010 14:58 от RXL » Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #19 : 30-05-2010 12:14 » 

JFYI
NetBeans может использовать движок Ruby либо свой собственный (встренный JRuby), либо сторонний, уже предустановленный.
Убедись что ты знаешь который используется у тебя - иногда у них есть свои особенности..
Например, в консоли ты будешь использовать "обычный" Ruby, а при отладке в NetBeans - JRuby (по умолчанию).. И будешь удивляться почему не находится тот или иной gem Улыбаюсь
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines