Приветствую!
-- Я к примеру хотел использовать такой несложный блок (m:= некоторое число от 0 до 60): 0 to: 60 by: 15 do:[:x | (m<x) ifTrue: [m:=x/15]] Я рассчитывал, что он вернёт число от 1 до 4 (в зависимости от того в какую из четвертей диапазона попадает m) Я заблуждался, возвращается 0. Я, получается, не могу правильно прочитать последовательность действий в этом блоке. И меня мучают два вопроса: 1. В какой же всё таки последовательности будет выполнятся этот блок, какое действие последнее, почему 0? 2. Раз я не понял почему 0 я решил принудительно вернуть результат при помощи ^ 0 to: 60 by: 15 do:[:x | (m<x) ifTrue: [^m:=x/15]] Здорово! В workspace всё работает... Но как использовать такой блок в методе, если за ним должен идти ещё ряд действий? Можно как-то вернуть значение блока с помощью ^ во временную переменную не прекращая метода? -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
> 1. В какой же всё таки последовательности будет выполнятся этот блок, какое действие последнее, почему 0?
А какое у вас значение m? > Но как использовать такой блок в методе, если за ним должен идти ещё ряд действий?
Сделать присваивание, кинуть исключение и тут же его поймать. Но это плохой путь. Хороший путь - перейти к итераторам. Читать последовательность как поток и вручную контролировать переходы (к следующему элементу).
Дмитрий 5 октября 2013 г., 18:59 пользователь Genosse Alex <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
число из диапазона 0 - 60. при любых значениях m возвращается 0 (если конечно не использовать ^) -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
метод #to:do: и не подразумевает возврат какого-либо значения. В таких случаях обычно возвращается получатель сообщения, то есть self, который в данном случае равен нулю. 5 октября 2013 г., 19:33 пользователь Genosse Alex <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
в вашем примере используется #to:by:do:. Смысл здесь тот же 5 октября 2013 г., 20:18 пользователь Denis Kudriashov <[hidden email]> написал:
-- 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
возвращает 0 потому что сообщение to:do:by: посылается числу 0. После выполнения цикла это самое число и вернется в качестве ответа. Если выполнить 5 to: 60 by: 15 do:[:x | (m<x) ifTrue: [m:=x/15]] будет ответ 5 А вот выражение где явно указать какую переменную вернуть будет такимm := 0. 0 to: 60 by: 15 do:[:x | (m<x) ifTrue: [m:=x/15]]. Реализация метода цикла для чисел. Number>>to: stop by: step do: aBlock "Normally compiled in-line, and therefore not overridable. Evaluate aBlock for each element of the interval (self to: stop by: step)." | nextValue | nextValue := self. step = 0 ifTrue: [self error: 'step must be non-zero']. step < 0 ifTrue: [[stop <= nextValue] whileTrue: [aBlock value: nextValue. nextValue := nextValue + step]] ifFalse: [[stop >= nextValue] whileTrue: [aBlock value: nextValue. nextValue := nextValue + step]] 5 октября 2013 г., 21:33 пользователь Genosse Alex <[hidden email]> написал:
-- 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 Denis Kudriashov
Что же? выходит городить ещё один метод?
-- У меня запасной вариант рабочий есть testTest: anObject 0 to: 60 by: 15 do:[:x | (anObject<x) ifTrue: [^ self test: x/15]] но городить лишний метод только ради этого... Как то не красиво. Да? суббота, 5 октября 2013 г., 20:19:16 UTC+4 пользователь Denis Kudriashov написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
зачем городить еще один метод. можно сделать так MyClass>>MyMethod0 to: 60 by: 15 do:[:x | (m<x) ifTrue: [m:=x/15]] . ^ m. 5 октября 2013 г., 22:35 пользователь Genosse Alex <[hidden email]> написал:
-- 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
CONTENTS DELETED
The author has deleted this message.
|
CONTENTS DELETED
The author has deleted this message.
|
Спасибо!
-- Теперь буду переваривать все ответы )) -- 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. |
In reply to this post by Genosse
Боже, господа, ну вы даже меня пугаете ответами :) Если вопрос "посчитать четверти", то ответ будет (m quo: 15) + 1 и никаких циклов ни с итераторами, ни без (только обратите внимание на числа 0 и 60).
Если вопрос "как в цикле поймать срабатывание условия и выйти по этому условию", то ответ - использовать #detect:
5 октября 2013 г., 21:38 пользователь Genosse Alex <[hidden email]> написал:
-- 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
Алекс, это именно так. Блок всегда возвращает значение последнего предложения. Всегда.
Если есть желание, присоединяйся ко мне в чат или в скайп, я расскажу на пальцах, что и как и почему. А то мы тут можем до скончания века гадать, что именно нужно, и придумывать всё более жуткие варианты ответов - тогда как по правде ответ для тебя - это примерно десяток букв кода почти наверняка :) 5 октября 2013 г., 21:48 пользователь Genosse Alex <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Просто в данном случае блок передается в качестве аргумента методу to:by:do: и работает он внутри его. А возвращается результат выполнения метода to:by:do посланого Числу 0, который просто возвращает самого себя. 2013/10/5 Юрий Мироненко <[hidden email]>
-- 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 Yuriy Mironenko
Да. До меня дошло уже, что блок это только то, что в [ ], и он работает как должен. quo: - это то что нужно и здорово в своей простоте... Печалит, только, что сам бы я точно этого днём с огнём не раскопал.., если только случайно... Позволю себе по брюзжать ;) Ещё раз подумал, что якобы крутая крива изучения Smalltalk - это следствие не сложности, а слабой документированности и малого кол-ва "разжёваной" литературы даже на английском. Тяжеловато просто лопатить всю это иерархию классов и методов, руководствоваться краткими комментариями к ним (где они есть). Кстати на таком английском, что переводятся они плохо и зачастую смысл ускользает. Вот полтора дня ковырял категорию Kernel-Chronology, пока добился от неё чего хотел... Как всегда всё лежало на поверхности, было бы более или менее развёрнутое описание этих классов и методов, то хватило бы и получаса времени... Благо, я могу себе позволить роскошь быть медленным и упрямым в этом изучении. А вот если бы пришлось думать об освоении Smalltalk как инструмента для конкретной коммерческой работы, то наверное пришлось быстренько переключится на что-то более широко документированное. На сайте http://rmod.lille.inria.fr/pbe2/ нашёл книжку Deep into Pharo, но похоже она тоже не претендует на роль справочника. -- 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.
|
In reply to this post by Genosse
Есчё вопрос не по теме, но про блоки.
-- Почему-то не работает как нужно такая конструкция: 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. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Так у вас anObject внутри цикла не изменяется, поэтому на каждой итерации вы добавляете одно и тоже 11 октября 2013 г., 22:37 пользователь Genosse Alex <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу Russian Smalltalk User Group. Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email]. Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out. |
Вероятно, я невнимательно проситал код и вопрос. Другой вариант: все anObject в каждой итерации цикла один и тот же объект 11 октября 2013 г., 23:02 пользователь Denis Kudriashov <[hidden email]> написал:
-- 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 |