Раздел «Язык Ruby».RubyCourseLecture15:
<<Метапрограммирование на Ruby

Следующая лекция
Предыдущая лекция

Лекция 15: Задачи для самостоятельного решения

make_shared_iterator

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)"

Следующая лекция
Предыдущая лекция