Дурацкий вопрос

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
27 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Дурацкий вопрос

Genosse
Приветствую!
Э-э... Вообще говоря, неплохо бы иметь какой ниб. отдельный раздельчик для ламерских вопросов, чтоб эфир не засорять..
Прошу сильно не пинать, специального не имею и потому, видать, изрядные пробелы дают себя знать, т.к. похоже вопрос скорее из области фундаментальной нежели вопрос синтаксиса языка... 

Собственно вопрос:
Вывожу посредством блока несколько копий объекта
как то так: 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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse
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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse
Теперь всё понятно отностительно "new" . Ещё раз Спасибо.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse
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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

kirand
Покажи метод initialize класса Class1.

пятница, 17 мая 2013 г., 21:01:29 UTC+3 пользователь Genosse Alex написал:
Ещё вопрос. Как изменить переменную экземпляра класса из другого класса? Не могу найти описания сего действа, может оно совершено очевидно.., но только не для меня...
например:
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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse
initialize
super initialize.
self x: 0.

пятница, 17 мая 2013 г., 22:26:42 UTC+4 пользователь kirand написал:
Покажи метод initialize класса Class1.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

kirand
А как ты знаешь, что у тебя x остается равным 0?

пятница, 17 мая 2013 г., 21:27:45 UTC+3 пользователь Genosse Alex написал:
initialize
super initialize.
self x: 0.

пятница, 17 мая 2013 г., 22:26:42 UTC+4 пользователь kirand написал:
Покажи метод initialize класса Class1.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

kirand
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 написал:
Ещё вопрос. Как изменить переменную экземпляра класса из другого класса? Не могу найти описания сего действа, может оно совершено очевидно.., но только не для меня...
например:
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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse
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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

kirand
Ну я догадывался о таком...

Вся проблема в том, что ты не сохраняешь ссылку на свой объект класса 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
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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Igor Stasenko
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.


Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Alexander D. Remizov

Это 2 абсолютно разных метода, один используется для запроса значения
переменной method у экземпляра класса,
другой-же для изменения значения этой переменной у экземпляра класса.
Опять таки, селекторы методов могут быть произвольными, т.е. пара
методов :

getVariableWithName_method
   ^ method

setVariableWithName_method_to: x
  method := x

будут выполнять те-же действия как и их более короткие/удобные побратимы.


Мда..   Это теперь, кажись, встало на место :)
Спасибо!


Вся проблема в том, что ты не сохраняешь ссылку на свой объект класса Class1 с значением х = 4. Ты создаешь объект, но не сохраняешь ссылку на него. Результат Class1 new нужно присваивать переменной.

Вроде тоже понятно... Руки чешутся опробовать... Посмотрим, дошло до меня или нет через каких-то 23 часа ;)
Спасибо.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse
In reply to this post by kirand

пятница, 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 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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Igor Stasenko
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.


Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse


Хотя по тексту вопроса, я подозреваю, что Вы не поняли что выражение
"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
 
 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Genosse
Всё, кажись прозрел! :) Ларчик просто открывался...

Если мы создаём сообщением экземпляр класса  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.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Igor Stasenko
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.


Reply | Threaded
Open this post in threaded view
|

Re: Дурацкий вопрос

Igor Stasenko
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.


12