0 end def has_next? @index < @array.length end def item @array[@index] end def next_item value = @array[@index] @index += 1 value end end array = ['красный', 'зелёный', 'синий'] i = ArrayIterator.new(array) while i.has_next? puts("элемент: #{i.next_item}") end пятница, 16 ноября 12 г.
Пока клиент не готов, он не будет запрашивать .next. Внутренний итератор непреклонно выдаёт элементы, не обращая внимание на желания клиента. пятница, 16 ноября 12 г.
= ArrayIterator.new(array1) iterator2 = ArrayIterator.new(array2) while iterator1.has_next? and iterator2.has_next? if iterator1.item < iterator2.item merged << iterator1.next_item else merged << iterator2.next_item end end while iterator1.has_next? merged << iterator1.next_item end while iterator2.has_next? merged << iterator2.next_item end merged end пятница, 16 ноября 12 г.
@name = name @balance = balance end def <=>(other) balance <=> other.balance end end class Portfolio include Enumerable def initialize @accounts = [] end def each(&block) @accounts.each(&block) end def add_account(account) @accounts << account end end пятница, 16 ноября 12 г.
получать её элементы. Внутренний итератор получает блок кода, который последовательно применяет к коллекции. В Ruby для реализации внутренних итераторов разумно будет использовать возможности модуля Enumerable. Если вы одновременно итерируете по коллекции и меняете её состав — будьте готовы к неприятным неожиданностям. пятница, 16 ноября 12 г.
текущий документ... # end end class NewDocumentButton < SlickButton def on_button_push # # Создать новый документ... # end end пятница, 16 ноября 12 г.
end # Много кода, который красиво рисует кнопку def on_button_push @command.execute if @command end end class SaveCommand def execute # ... end end save_button = SlickButton.new(SaveCommand.new) пятница, 16 ноября 12 г.
end # Много кода, который красиво рисует кнопку... def on_button_push @command.call if @command end end new_button = SlickButton.new do # Создать новый документ... end пятница, 16 ноября 12 г.
end def add_command(cmd) @commands << cmd end def execute @commands.each {|cmd| cmd.execute} end def description description = '' @commands.each {|cmd| description += cmd.description + "\n"} description end end пятница, 16 ноября 12 г.
файл: #{path}" @path = path @contents = contents end def execute f = File.open(@path, "w") f.write(@contents) f.close end def unexecute File.delete(@path) end end пятница, 16 ноября 12 г.
#{path}" @path = path end def execute if File.exists?(@path) @contents = File.read(@path) end f = File.delete(@path) end def unexecute if @contents f = File.open(@path,"w") f.write(@contents) f.close end end end пятница, 16 ноября 12 г.
как выполнять некие действия. Паттерн полезен, чтобы создавать списки действий, которые должна сделать программа и чтобы отменять эти действия. пятница, 16 ноября 12 г.
Реализовать класс группа, который включает в себя массив студентов. Реализовать внутренний итератор в классе группа, который позволит проводить итерацию по студентам, находящимся в группе. Можно использовать модуль Enumerable. пятница, 16 ноября 12 г.
слова. В качестве атомарных команд реализовать: умножение всех числовых элементов массива на 2; возведение всех численных элементов массива в квадрат; «разворот» всех строковых элементов массива задом наперёд. Используя паттерн Composite, реализовать систему, позволяющую конструировать из базовых команд различные составные, сложные команды, объединяющие базовые команды в различных комбинациях. С помощью паттерна команда реализовать возможность применения команд и отката их применения (undo). пятница, 16 ноября 12 г.