| 
			| 
					
						| BlackThornGreed 
								Гость
 | 
								|  | «  : 25-05-2010 00:04 »  |  | 
 
 приветствую всех кто зашел в эту тему.
 требуется помощь в ruby.
 
 взял я себе задание, начал писать программу и до какого то момента все шло прекрасно, но потом как это всегда бывает начались проблемы...
 суть вот в чем:
 требуется создать класс, и переопределить для него операторы + - * / .
 
 этих вещей я не разу не делал, и представляю себе довольно смутно как делать.
 мне бы очень помог небольшой пример с пояснениями, чтобы я мог сделать по аналогии и разобраться.
 
 прочитал пару книг о программировании на Ruby, но суть оформления класса и перегрузки операторов не смог понять.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #1 : 25-05-2010 01:06 »  |  | 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| BlackThornGreed 
								Гость
 | 
								|  | « Ответ #2 : 25-05-2010 07:36 »  |  | 
 
 RXL, спасибо добрый человек)) вот только ошибки в этом примере были.. пропущенные скобки и лишние пробелы после родительских конструкций. class Complexdef +(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 долларов - это не вполне прилично |  |  | 
	|  |