Приветствую!
Э-э... Вообще говоря, неплохо бы иметь какой ниб. отдельный раздельчик для ламерских вопросов, чтоб эфир не засорять.. Прошу сильно не пинать, специального не имею и потому, видать, изрядные пробелы дают себя знать, т.к. похоже вопрос скорее из области фундаментальной нежели вопрос синтаксиса языка... Собственно вопрос: Вывожу посредством блока несколько копий объекта как то так: buttons := (1 to: 5) collect: [ :each | CalcSimpleButton new ] получаю разумеется 5 одинаковых CalcSimpleButton Загвоздка в том что в объекте есть переменная "х", которая должна при это пробегать ряд числовых значений. Т.е. должно получиться 5 экземпляров условно такого вида CalcSimpleButton 1 CalcSimpleButton 2 ... CalcSimpleButton 5 Как можно реализовать некую конструкцию в которой можно было бы еще и изменять переменную другого объекта?
-- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
CONTENTS DELETED
The author has deleted this message.
|
CalcSimpleButton newWithX: Во! Точно! в принципе вроде понятно и уже знакомо. В книжках ведь не раз читал, но узнавание пришло почему-то только постфактум.., когда уже т.с. нос ткнули... И ведь метод number: а'ля WithX: уже создал, а new в сообщении не указал... Спасибо. PS: только ещё вопрос. Почему у Вас метод WithX: с Заглавной буквы или это метод newWithX:? я признаться подумал, что Вы пробел пропустили, а потом подумал, что не пропустили... и теперь думаю есть ли какое-то принципиальное отличие CalcSimpleButton newWithX: each от того что у меня заработало CalcSimpleButton new
number: each Метод number: number: anInteger number := anInteger -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
CONTENTS DELETED
The author has deleted this message.
|
Теперь всё понятно отностительно "new" . Ещё раз Спасибо.
-- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
In reply to this post by Genosse
Ещё вопрос. Как изменить переменную экземпляра класса из другого класса? Не могу найти описания сего действа, может оно совершено очевидно.., но только не для меня... например: Object subclass: #Class1 instanceVariableNames: 'x' classVariableNames: '' poolDictionaries: '' category: 'Midden' Инициализирую для удобства x:=0 Из метода класса Class2 пытаюсь изменить переменную x Class1 таким вот незатейливым сообщением: Class1 new x:3 x остаётся равным 0... Вероятно не правильно реализованы методы Class1? x ^x и x: xx x:=xx Признаться не до конца улавливаю т.с. "физический смысл", пытался делать по аналогии. PS.: Вообще, конечно, основная проблема довольно странного свойства... С одной стороны всё предельно ясно: Всё объекты которые обмениваются сообщениями. Как биологом по образованию мной это довольно органично воспринимается. Синтаксис не смущает т.к. ни на чём толком не программировал, кроме чутка на php. Как и какие пишутся сообщения держу перед глазами, благо справочного материала хватает. Но непонятен сам алгоритм работы, что ли... В литературе, которую читал всё описано слишком мозаично, многое как будто само разумеющееся. Вот к примеру почему методы часто встречаются парами вроде metod metod: Зачем metod в котором ничего кроме ^metod ? Ну и так далее... PPS.: Сам наблюдал похожую картину невозможности воспользоваться некими инструментами из-за банального недопонимания методологии работы, когда преподавал компьютерную графику учителям художественных школ. Люди умеющие рисовать долгое время не могли вообще ничего нарисовать при помощи соответствующего ПО, наглухо завязали в поисках глубинного смысла и т.д., хотя для собственно рисования достаточно всего двух трёх инструментов, пары хоткеев и осознания определённого несложного алгоритма их применения. Теперь сам оказался в таком положении. Может кто нибудь, что нибудь присоветовать в таком случае? -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Покажи метод initialize класса Class1.
-- пятница, 17 мая 2013 г., 21:01:29 UTC+3 пользователь Genosse Alex написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
initialize super initialize. self x: 0. пятница, 17 мая 2013 г., 22:26:42 UTC+4 пользователь kirand написал: -- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
А как ты знаешь, что у тебя x остается равным 0?
пятница, 17 мая 2013 г., 21:27:45 UTC+3 пользователь Genosse Alex написал: -- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
In reply to this post by Genosse
Рекомендую книжку http://rutracker.org/forum/viewtopic.php?t=3299427
Зачем metod в котором ничего кроме ^metod? Доступ к переменным экземпляра класса имеет только класс, который ими владеет. Тоесть, он может обращаться к ним напрямую, но это непрактично на самом деле. Для того, чтобы другие классы могли запрашивать или менять эту переменную создаются методы доступа (обычно их название getter и setter). Вот поэтому такой метод и возвращает значение переменной. Мало того, довольно часто может понадобится что-то дополнительно делать в setter-е и там можно дописать дополнительную работу. В этом и состоит практичность такого метода. пятница, 17 мая 2013 г., 21:01:29 UTC+3 пользователь Genosse Alex написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
In reply to this post by kirand
Вывожу результат в seaside
Class2 renderContentOn: html html heading: result. html anchor callback: [Class1 new x:4]; with: button1. html anchor callback: [result:=Class1 new result ]; with: button2. Class1 метод result пока такой: result |z a b| a:=self x. b:=self x. z:= a+ b. ^z Так выходит, что отображается сумма значений x которые указаны в initialize изначально. пятница, 17 мая 2013 г., 22:28:51 UTC+4 пользователь kirand написал: А как ты знаешь, что у тебя x остается равным 0? -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Ну я догадывался о таком...
Вся проблема в том, что ты не сохраняешь ссылку на свой объект класса Class1 с значением х = 4. Ты создаешь объект, но не сохраняешь ссылку на него. Результат Class1 new нужно присваивать переменной. Набери в workspace: |my 1| my1 := Class1 new x:3. Transcript show: my1 x. Открой экран Transcript, выдели набранный текст и нажми Do It. Увидишь, что все ок. А то, что ты делаешь в Seaside для меня вообще непонятно... Я подозреваю, что это что-то похожее на встроенный пример Counter в Seaside. пятница, 17 мая 2013 г., 21:53:17 UTC+3 пользователь Genosse Alex написал: Вывожу результат в seaside -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
In reply to this post by Genosse
Давайте сначала отделим мух от котлет.
Вопрос: >Вот к примеру почему методы часто встречаются парами вроде metod metod: Зачем metod в котором >ничего кроме ^metod ? Ну и так далее... Имеем метод в виде: 1 | method 2 | ^ method (1 палка - 2 палка - это я пронумеровал строки чтоб было понятно - это не часть синтаксиса) Итак, в строке 1 записан селектор (или имя/ название) метода и может быть выбран произвольно. Это значит, что методы: foo ^ bar и bar ^ bar будучи посланы одному и тому-же обьекту, выполнят абсолютно те же операции (тело обоих методов одинаковое) Теперь о строке 2. В строке 2 находится тело метода, т.е. что выполнится если вы пошлете сообщение обьекту имеющим данный метод. А тело у нас такое: 2 | ^ method значит "вернуть значение переменной method". Естественно данная переменная не может быть взята с потолка (в отличие от названия метода в строке 1), а должна быть заранее определена классом, иначе компилятор скажет Вам фу :) Далее. Имеем 2 метода: method ^ method method: x method := x Это 2 абсолютно разных метода, один используется для запроса значения переменной method у экземпляра класса, другой-же для изменения значения этой переменной у экземпляра класса. Опять таки, селекторы методов могут быть произвольными, т.е. пара методов : getVariableWithName_method ^ method setVariableWithName_method_to: x method := x будут выполнять те-же действия как и их более короткие/удобные побратимы. П.С. Честно говоря, когда я начинал, меня это то сильно озадачивало.. но потом я понял где мухи а где котлеты и меня это уже не смущает. :) -- Best regards, Igor Stasenko. -- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Это 2 абсолютно разных метода, один используется для запроса значения Мда.. Это теперь, кажись, встало на место :) Спасибо!
Вроде тоже понятно... Руки чешутся опробовать... Посмотрим, дошло до меня или нет через каких-то 23 часа ;) Спасибо. -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
In reply to this post by kirand
пятница, 17 мая 2013 г., 23:14:35 UTC+4 пользователь kirand написал: Ну я догадывался о таком... Похоже я всё таки не всё понял... Смысл вроде понятен: x в классе Class1 всегда с одним и тем же значением (которое было в initialize). Посылая сообщение Class1 new x:= 1, я не перезаписываю значение переменной, а создаю экземпляр класса Class1 с х:=1 и соответственно его надо бы куда то поместить, для дальнейших манипуляций. Так ведь? Но как это сделать если я хочу из класса Class2 передать отдельными сообщениями в Class1 Class1 new x:= 1 Class1 new y:= 1 а затем получить от Class1 result. result |z a b| a:=self x. b:=self y. z:= a+ b. ^z Как в таком случае сохранить новый экземпляр Class1 в котором бы сначаа был изменён x, затем y, и вычислен result?Или так вообще не делается? А тогда как? Вариант присваивать переменной q Class2 выражение Class1 new resultX:1 Y:1 ? Он конечно работает... Но что если передаваемых параметров будет больше, да и вообще как-то не гибко это выглядит. Видимо есть подход который в принципе несколько по другому решает подобные задачи?
-- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
2013/5/19 Genosse Alex <[hidden email]>:
> > пятница, 17 мая 2013 г., 23:14:35 UTC+4 пользователь kirand написал: >> >> Ну я догадывался о таком... >> >> Вся проблема в том, что ты не сохраняешь ссылку на свой объект класса >> Class1 с значением х = 4. Ты создаешь объект, но не сохраняешь ссылку на >> него. Результат Class1 new нужно присваивать переменной. >> >>>>>>> > > Похоже я всё таки не всё понял... Смысл вроде понятен: > x в классе Class1 всегда с одним и тем же значением (которое было в > initialize). Посылая сообщение Class1 new x:= 1, я не перезаписываю > значение переменной, а создаю экземпляр класса Class1 с х:=1 и > соответственно его надо бы куда то поместить, для дальнейших манипуляций. > Так ведь? > > > Но как это сделать если я хочу из класса Class2 передать отдельными > сообщениями в Class1 > Class1 new x:= 1 > Class1 new y:= 1 это не правильный синтаксис. Правильный вот: Class1 new x: 1 для простоты понимания , этот код можно переписать в такой: | newInstance | newInstance := Class1 new. newInstance x: 1 т.е., за исключением того что мы используем временную переменную (newInstance) действия совершаемые в обоих примерах одинаковые: 1. послать сообщение #new обьекту Class1 2. *полученному* обьекту (в результате посылки new в п.1) послать сообщение #x: , с аргументом 1. Хотя по тексту вопроса, я подозреваю, что Вы не поняли что выражение "Class1 new" создает новый обьект, а не возвращает один и тот же обьект снова и снова. Для проверки, попробуйте выполнить следующее в Workspace: | a b | a := Class1 new x: 1. b := Class1 new y: 1. a == b И похоже для полного понимания, Вам следует проверить еще следующее: a == Class1 Также попробуйте выполнить следующее: Class1 inspect. и Class1 new inspect (и почувствуйте разницу :) > а затем получить от Class1 result. > result > |z a b| > a:=self x. > b:=self y. > z:= a+ b. > ^z > Как в таком случае сохранить новый экземпляр Class1 в котором бы сначаа был > изменён x, затем y, и вычислен result? > Или так вообще не делается? А тогда как? > Вариант присваивать переменной q Class2 выражение Class1 new resultX:1 Y:1 ? > Он конечно работает... Но что если передаваемых параметров будет больше, да > и вообще как-то не гибко это выглядит. > > Видимо есть подход который в принципе несколько по другому решает подобные > задачи? > - мы создали новый обьект - инициализировали его до нужной кондиции - далее мы хотим в будущем иметь к этому обьекту доступ чтобы обратиться к нему решение очевидно: ссылка на данный обьект должна быть сохранена где-то, где ее можно будет потом опять получить. Подумайте логически: представьте модель данных вашей программы/алгоритма, и ответьте на простой вопрос: как ваша модель может обратиться к какому-то обьекту, если вы не храните ссылки на данный обьект внутри вашей модели? > -- > http://groups.google.ru/group/sugr > --- > Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk > User Group. > > Чтобы отказаться от подписки на эту группу и перестать получать из нее > сообщения, отправьте электронное письмо на адрес > [hidden email]. > Настройки подписки и доставки писем: > https://groups.google.com/groups/opt_out. > > -- Best regards, Igor Stasenko. -- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Это я понял и собственно сей факт и поставил меня в тупик. Верно я понимаю, что при таком положении вещей я получаю следующее: Инициализировано х:=0. у:=0 Сообщение Class1 new x: 1. Создаст экземпляр Class1 с х=1 у=0 Следующее сообщение Class1 new у: 1. Создаст другой экземпляр Class1 с х=0 у=1. Итого вместо экземпляра Class1 с х=1 у=1 у меня 2 экземпляра, выше перечисленных. Ну а попытка получить Class1 new result благополучно создаст экземпляр с суммой нулей, которые были инициализированы изначально. Как быть? Передавать все значения переменных и вычислять результат в одном методе, так сказать за один приём? Вроде q:= Class1 new resultX:1 Y:1 -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Всё, кажись прозрел! :) Ларчик просто открывался...
Если мы создаём сообщением экземпляр класса Class1 и присваиваем его некой переменной Class2. q:= Class1 new. То мы не просто присваиваем значение нового экземпляра класса Class1, а получаем весь Class1 со всеми потрошками! Т.е. q теперь и есть Class1 т.с. с исправленной фамилией в паспорте. Следовательно q можно, не торопясь, ступенчато передавать необходимые параметры. напр. q x: 3. q y: 4. и получить при необходимости результат Transcript show: q result. Так? -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
In reply to this post by Genosse
2013/5/19 Genosse Alex <[hidden email]>:
>> >> >> Хотя по тексту вопроса, я подозреваю, что Вы не поняли что выражение >> "Class1 new" >> создает новый обьект, а не возвращает один и тот же обьект снова и снова. > > Это я понял и собственно сей факт и поставил меня в тупик. > Верно я понимаю, что при таком положении вещей я получаю следующее: > Инициализировано х:=0. у:=0 > Сообщение Class1 new x: 1. Создаст экземпляр Class1 с х=1 у=0 > Следующее сообщение Class1 new у: 1. Создаст другой экземпляр Class1 с х=0 > у=1. > Итого вместо экземпляра Class1 с х=1 у=1 у меня 2 экземпляра, выше > перечисленных. > Ну а попытка получить Class1 new result благополучно создаст экземпляр с > суммой нулей, которые были инициализированы изначально. > > Как быть? Передавать все значения переменных и вычислять результат в одном > методе, так сказать за один приём? > Вроде > q:= Class1 new resultX:1 Y:1 > зависимости от какого-то набора входных параметров. Если набор параметров неизменен, то конечно удобнее всего просто создать метод который все делает и выдает результат: result := Class1 resultOfX: 1 andY: 2 заметьте, что сообщение посылается не экземпляру класса, а самому классу. В этом случае пользователю совершенно не нужно заморачиваться, сколько и какие обьекты учавствуют в вычислении, так как ему нужен только конечный результат. В ситуации когда набор параметров в будущем может измениться или когда нужно дать пользователю возможность передавать только нужные ему параметры (остальные будут инициализированы по умолчанию), выше указанный подход не очень удобен. Вам или придется плодить кучу методов типа: result := Class1 resultOfY: 1 или result := Class1 resultOfX: 1 а потом, когда количество параметров возрастет, пойдет комбинаторика, типа: result := Class1 resultOfX: 1 andZ: 2 result := Class1 resultOfY: 1 andZ: 2 result := Class1 resultOfZ: 1 .... в таком случае, действительно удобнее использовать обьект, который накапливает входящие данные, а потом вычисляет их по требованию, и конечно создание экземпляра класса, который будет ответственным за эти вычисления и накопление параметров более чем уместно. Под этот сценарий, более подходит следующий код: | resultComputer result | resultComputer := ResultComputer new. resultComputer setParam1: 1. resultComputer setParam2: 1.4. resultComputer setParam3: 44. result := resultComputer computeResult. Или переписав это ближе к вашему примеру: | instance result | instance := Class1 new. instance x: 1. instance y: 1. result := instance result. ну и наконец, переписав код с использованием знания синтаксиса языка: | result | result := Class1 new x: 1; y: 1; result. как видите, в этом примере, если мы можем убрать строку с x: 1; или y: 1; т.е. мы вольны задавать только те параметры которые считаем нужными, тогда как остальные инициализированны по умолчанию. -- Best regards, Igor Stasenko. -- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
In reply to this post by Genosse
2013/5/19 Genosse Alex <[hidden email]>:
> Всё, кажись прозрел! :) Ларчик просто открывался... > > Если мы создаём сообщением экземпляр класса Class1 и присваиваем его некой > переменной Class2. > q:= Class1 new. То мы не просто присваиваем значение нового экземпляра > класса Class1, а получаем весь Class1 со всеми потрошками! Т.е. q теперь и > есть Class1 т.с. с исправленной фамилией в паспорте. > Следовательно q можно, не торопясь, ступенчато передавать необходимые > параметры. > напр. > q x: 3. > q y: 4. > и получить при необходимости результат > Transcript show: q result. > > Так? > да все имеено так, в части результата. Но по поводу "получаем весь Class1 со всеми потрошками" это неправильный вывод. От сообщения "Class1 new" Вы получаете как-раз именно экземпляр класса. Другими словами это: - обьект, чей класс это Class1. Но в смаллтолке, все обьекты это экземпляры какого-то класса, включая сами классы. Если вам непонятно различие между классом и его экземплярами, попробуйте вычислить выражения: Class1 == Class1 new Class1 == Class1 new class Class1 class == Class1 > -- > -- > http://groups.google.ru/group/sugr > --- > Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk > User Group. > > Чтобы отказаться от подписки на эту группу и перестать получать из нее > сообщения, отправьте электронное письмо на адрес > [hidden email]. > Настройки подписки и доставки писем: > https://groups.google.com/groups/opt_out. > > -- Best regards, Igor Stasenko. -- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Free forum by Nabble | Edit this page |