BlackThornGreed
Гость
|
|
« : 25-05-2010 00:04 » |
|
приветствую всех кто зашел в эту тему.
требуется помощь в ruby.
взял я себе задание, начал писать программу и до какого то момента все шло прекрасно, но потом как это всегда бывает начались проблемы... суть вот в чем: требуется создать класс, и переопределить для него операторы + - * / .
этих вещей я не разу не делал, и представляю себе довольно смутно как делать. мне бы очень помог небольшой пример с пояснениями, чтобы я мог сделать по аналогии и разобраться.
прочитал пару книг о программировании на Ruby, но суть оформления класса и перегрузки операторов не смог понять.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 25-05-2010 01:06 » |
|
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #4 : 25-05-2010 08:08 » |
|
На мой взгляд, везде должны быть @real и @imag , поскольку это объекты экземпляра класса.
Алексей1153++, а ты какую ошибку имел в виду?
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
BlackThornGreed
Гость
|
|
« Ответ #5 : 25-05-2010 08:10 » |
|
Алексей1153++, да тоже интересно в чем ошибка там.
baldr, спасибо ответил кратко но исчерпывающе
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 25-05-2010 08:13 » |
|
baldr, BlackThornGreed, мне всегда казалось, что при сложении векторов их составляющие тоже складываются
|
|
|
Записан
|
|
|
|
BlackThornGreed
Гость
|
|
« Ответ #7 : 25-05-2010 08:16 » |
|
Алексей1153++, да я тоже заметил только сейчас. благодарю за поправку и ответ.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 25-05-2010 08:18 » |
|
в делении тоже есть грабля - надо проверять denom на ноль (вернее, на почти ноль) или просто ловить исключение, если тут это можно делать. Если исключение возникло, сравнить знаки частей операндов и выставить "бесконечность" с нужным знаком для обоих частей результата
|
|
|
Записан
|
|
|
|
BlackThornGreed
Гость
|
|
« Ответ #9 : 25-05-2010 10:29 » |
|
а поясните почему при вызове на исполнение файла с этим классом мне в результате выдает строку
|
|
|
Записан
|
|
|
|
baldr
|
|
« Ответ #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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #11 : 25-05-2010 12:35 » |
|
На мой взгляд, везде должны быть @real и @imag , поскольку это объекты экземпляра класса. Либо self.real, self.imag, если есть акссессоры. И вообще, где конструктор класса, где аксессоры к атрибутам?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #13 : 26-05-2010 08:56 » |
|
Подозреваю, что остальные методы раскиданы по всей книге.. Ужас. Тогда это не для начинающих. Они же собрать не сумеют.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #19 : 30-05-2010 12:14 » |
|
JFYI NetBeans может использовать движок Ruby либо свой собственный (встренный JRuby), либо сторонний, уже предустановленный. Убедись что ты знаешь который используется у тебя - иногда у них есть свои особенности.. Например, в консоли ты будешь использовать "обычный" Ruby, а при отладке в NetBeans - JRuby (по умолчанию).. И будешь удивляться почему не находится тот или иной gem
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
|