<<Метапрограммирование на Ruby
Лекция 15: Задачи для самостоятельного решения
make_shared_iterator
- RubyCourseLecture15
- Защита метода each_object
- После выполнения он должен восстанавливаться
- Хорошо делать патч только в одном треде (или контексте)
- Возможность использовать несколько раз в одном модуле
make_trier && try_n_times && make_rescued
wrap_method
this_thread
class Array
# add feature to the method :at
wrap_method(:at, :this_thread => true) do |obj, args, method|
if obj.size <= args[0]
raise ArgumentError, "Wrong index #{args[0]}"
end
value = method[*args]
if value.nil?
'undefined'
else
value
end
end
end
# feature works
[1,2,3].at(5)
Thread.new do
# feature does not work
[1,2,3].at(5)
end
context
# задать контекст, в котором обертка имеет место быть можно с помощью опции
class Array
wrap_method(:at, :context => 'abc') do
# ...
end
end
# и специальный блок, для установки контекста
context("abc") do
# можно обертку указать прямо в блоке context,
# что равносильно опции :context
class Array
wrap_method(:at) do
# feature
end
end
Thread.new do
# feature works
[1,2,3].at(5)
end
# feature works
[1,2,3].at(5)
end
# feature does not work
[1,2,3].at(5)
make_cached
http://projects.mipt.ru/projects/make-cached/
mr-dedupe
*
http://projects.mipt.ru/projects/mr-dedupe/
reduce.rb
Поточная обработка tab-separated файлов
$ cat a.t | tabreduce.rb -r sum[3],min[2],rsigma[1],u[1] -u "( rv && rv*v || v)"