использование ^ в блоках внутри методов

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

Re: использование ^ в блоках внутри методов

Genosse
Уф... У меня прелом мозга...
а  как  или  почему должен изменятся anObject? Я хотел n-ое кол-во anObject с разным someVariable... 
Вообще есть какие-то пути как исследовать то что происходит внутри блока? А то сейчас блок для меня как чёрный ящик. Вижу только результат и могу только строить предположения от чего он получился.



пятница, 11 октября 2013 г., 23:02:17 UTC+4 пользователь Denis Kudriashov написал:
Так у вас anObject внутри цикла не изменяется, поэтому на каждой итерации  вы добавляете одно и тоже


11 октября 2013 г., 22:37 пользователь Genosse Alex <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="8wpi_UACH6oJ">gen...@...> написал:
Есчё вопрос не по теме, но про блоки.

Почему-то не работает как нужно такая конструкция:

aNumber to: aNumber do: [ :x | x:=0. anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. x:= x+1].

Почему-то у всех  anObject добавленных в коллекцию collectionObjects все переменные someVariable одинаковые, хотя я рассчитывал, что они будут увеличиваться на х+1 :(
Наверное опять велосипед изобретаю...

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="8wpi_UACH6oJ">sugr+uns...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
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: использование ^ в блоках внутри методов

Denis Kudriashov
Самый главный инструмент - это отладчик.
Но главный принцип, который нужно понять: в смолтолке нет магии, все работает через посылку сообщения. Любые переменные (имена классов тоже) являются просто "синонимами" (именами известными компилятору) обычных объектов, с которыми вы можете общаться через посылку сообщения. Не имеет значения, где вы используете переменные, нигде никакой магии не будет, в блоке переменная не будет скопирована сама по себе. Все что происходит, происходит только в ответ на сообщение, и реализацию обработки любого сообщения вы всегда можете посмотреть через стандартные инструменты


11 октября 2013 г., 23:25 пользователь Genosse Alex <[hidden email]> написал:
Уф... У меня прелом мозга...
а  как  или  почему должен изменятся anObject? Я хотел n-ое кол-во anObject с разным someVariable... 
Вообще есть какие-то пути как исследовать то что происходит внутри блока? А то сейчас блок для меня как чёрный ящик. Вижу только результат и могу только строить предположения от чего он получился.



пятница, 11 октября 2013 г., 23:02:17 UTC+4 пользователь Denis Kudriashov написал:
Так у вас anObject внутри цикла не изменяется, поэтому на каждой итерации  вы добавляете одно и тоже


11 октября 2013 г., 22:37 пользователь Genosse Alex <[hidden email]> написал:
Есчё вопрос не по теме, но про блоки.

Почему-то не работает как нужно такая конструкция:

aNumber to: aNumber do: [ :x | x:=0. anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. x:= x+1].

Почему-то у всех  anObject добавленных в коллекцию collectionObjects все переменные someVariable одинаковые, хотя я рассчитывал, что они будут увеличиваться на х+1 :(
Наверное опять велосипед изобретаю...

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

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

--
--
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: использование ^ в блоках внутри методов

Yuriy Mironenko
In reply to this post by Genosse
Чтобы поставить брекпойнт - хоть внутри блока, хоть в любом другом месте - вставьте туда self break. Когда код дойдёт до этого места, откроется отладчик.

Я хотел n-ое кол-во anObject с разным someVariable... 

Для того, чтобы получить, скажем, десять разных объектов, эти десять объектов надо где-то создать, так? Какое место вашего кода, по вашей мысли, должно создавать новые объекты?


11 октября 2013 г., 23:25 пользователь Genosse Alex <[hidden email]> написал:
Уф... У меня прелом мозга...
а  как  или  почему должен изменятся anObject? Я хотел n-ое кол-во anObject с разным someVariable... 
Вообще есть какие-то пути как исследовать то что происходит внутри блока? А то сейчас блок для меня как чёрный ящик. Вижу только результат и могу только строить предположения от чего он получился.



пятница, 11 октября 2013 г., 23:02:17 UTC+4 пользователь Denis Kudriashov написал:
Так у вас anObject внутри цикла не изменяется, поэтому на каждой итерации  вы добавляете одно и тоже


11 октября 2013 г., 22:37 пользователь Genosse Alex <[hidden email]> написал:
Есчё вопрос не по теме, но про блоки.

Почему-то не работает как нужно такая конструкция:

aNumber to: aNumber do: [ :x | x:=0. anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. x:= x+1].

Почему-то у всех  anObject добавленных в коллекцию collectionObjects все переменные someVariable одинаковые, хотя я рассчитывал, что они будут увеличиваться на х+1 :(
Наверное опять велосипед изобретаю...

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

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

--
--
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
что-то я вчера неправильно написал два варианта попутал
aNumber to: aNumber do: [ :x | anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. ].
и
|x|
x:=0. 
aNumber timesRepeat:  [ :x | anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. x:= x+1].
но в правильном виде тоже не работает.

Объекты создавать? Я думал путём добавления их в collectionObjects и они действительно добовляются в количестве aNumber, но у них совсем одинаковые someVariable
Пробовал создовать коллекцию во временой переменной и потом проиди по ней добавляя х но один чёрт...
Попробую с отладчиком, может что-то прояснится.

суббота, 12 октября 2013 г., 0:07:56 UTC+4 пользователь Assargadon написал:
Чтобы поставить брекпойнт - хоть внутри блока, хоть в любом другом месте - вставьте туда self break. Когда код дойдёт до этого места, откроется отладчик.

Я хотел n-ое кол-во anObject с разным someVariable... 

Для того, чтобы получить, скажем, десять разных объектов, эти десять объектов надо где-то создать, так? Какое место вашего кода, по вашей мысли, должно создавать новые объекты?


11 октября 2013 г., 23:25 пользователь Genosse Alex <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="05FGELgztsQJ">gen...@...> написал:
Уф... У меня прелом мозга...
а  как  или  почему должен изменятся anObject? Я хотел n-ое кол-во anObject с разным someVariable... 
Вообще есть какие-то пути как исследовать то что происходит внутри блока? А то сейчас блок для меня как чёрный ящик. Вижу только результат и могу только строить предположения от чего он получился.



пятница, 11 октября 2013 г., 23:02:17 UTC+4 пользователь Denis Kudriashov написал:
Так у вас anObject внутри цикла не изменяется, поэтому на каждой итерации  вы добавляете одно и тоже


11 октября 2013 г., 22:37 пользователь Genosse Alex <[hidden email]> написал:
Есчё вопрос не по теме, но про блоки.

Почему-то не работает как нужно такая конструкция:

aNumber to: aNumber do: [ :x | x:=0. anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. x:= x+1].

Почему-то у всех  anObject добавленных в коллекцию collectionObjects все переменные someVariable одинаковые, хотя я рассчитывал, что они будут увеличиваться на х+1 :(
Наверное опять велосипед изобретаю...

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="05FGELgztsQJ">sugr+uns...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
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: использование ^ в блоках внутри методов

Yuriy Mironenko
Объекты создавать? Я думал путём добавления их в collectionObjects

Алекс, считайте, что в переменных всегда хранятся указатели на объекты.

Вот вам кусок кода, традиционно показывающий разницу между присваиванием значений и присваиванием указателей (скорее всего вы встречались с аналогичными примерами на других языках):
====================
a:='abcdef'.
b:=a.     "присваиваем указатель"
a at: 2 put: $2.    "изменяем первоначальную строчку"
"Теперь посмотрите значения a и b - значение будет  'a2cdef' у обеих, потому что и a и b ссылаются на одну и ту же строку"
====================



12 октября 2013 г., 5:38 пользователь Genosse Alex <[hidden email]> написал:
что-то я вчера неправильно написал два варианта попутал
aNumber to: aNumber do: [ :x | anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. ].
и
|x|
x:=0. 
aNumber timesRepeat:  [ :x | anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. x:= x+1].
но в правильном виде тоже не работает.

Объекты создавать? Я думал путём добавления их в collectionObjects и они действительно добовляются в количестве aNumber, но у них совсем одинаковые someVariable
Пробовал создовать коллекцию во временой переменной и потом проиди по ней добавляя х но один чёрт...
Попробую с отладчиком, может что-то прояснится.

суббота, 12 октября 2013 г., 0:07:56 UTC+4 пользователь Assargadon написал:
Чтобы поставить брекпойнт - хоть внутри блока, хоть в любом другом месте - вставьте туда self break. Когда код дойдёт до этого места, откроется отладчик.

Я хотел n-ое кол-во anObject с разным someVariable... 

Для того, чтобы получить, скажем, десять разных объектов, эти десять объектов надо где-то создать, так? Какое место вашего кода, по вашей мысли, должно создавать новые объекты?


11 октября 2013 г., 23:25 пользователь Genosse Alex <[hidden email]> написал:

Уф... У меня прелом мозга...
а  как  или  почему должен изменятся anObject? Я хотел n-ое кол-во anObject с разным someVariable... 
Вообще есть какие-то пути как исследовать то что происходит внутри блока? А то сейчас блок для меня как чёрный ящик. Вижу только результат и могу только строить предположения от чего он получился.



пятница, 11 октября 2013 г., 23:02:17 UTC+4 пользователь Denis Kudriashov написал:
Так у вас anObject внутри цикла не изменяется, поэтому на каждой итерации  вы добавляете одно и тоже


11 октября 2013 г., 22:37 пользователь Genosse Alex <[hidden email]> написал:
Есчё вопрос не по теме, но про блоки.

Почему-то не работает как нужно такая конструкция:

aNumber to: aNumber do: [ :x | x:=0. anObject someVariable: (anObject someVariable + x). self collectionObjects add: anObject. x:= x+1].

Почему-то у всех  anObject добавленных в коллекцию collectionObjects все переменные someVariable одинаковые, хотя я рассчитывал, что они будут увеличиваться на х+1 :(
Наверное опять велосипед изобретаю...

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес sugr+uns...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

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

--
--
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
self break действительно полезно! 
Наконец-то могу рассмотреть, что происходит за [ ].
Наглядно убедился, что всё, что я запихал в коллекцию есть копии ссылок на один объект, а не разные объекты.

Но какое решение данной проблемы будет более грамотным?
1. Первое что напрашивается (и действительно работает) это создавать новые объекты, присваивать соответствующей переменой значение переменой исходного объекта и уже с ней проводить манипуляции. Что то вроде:

addObject: anObject amount: aNumber
|newSomeObject|
(0 to: aNumber) do: [ :x |
newSomeObject:= SomeObject  new.
newSomeObject someVariable: anObject someVariable.
newSomeObject someVariable: (newSomeObject someVariable + x ). 
self collectionObjects add: newSomeObject ]. 

Работает, но если много переменных, то очень громоздко и не гибко.

2. Делать копию объекта. Я использовал copyTwoLevel. Вроде работает как надо Но с копиями, как я читал, всё не так уж просто.
 Боюсь не будет ли трудно контролировать и  чревато ли это какими-то сложно уловимыми проблемами? 
Стоит ли использовать deepCopy?
 

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