在这种情况下,可转移工作如何?

时间:2015-07-31 22:14:08

标签: ruby metaprogramming rack

我跟随tutorial to make a Rack-based app

require 'forwardable'
module Eldr
  class App
    class << self
      extend Forwardable
      attr_accessor :builder
      def_delegators :builder, :map, :use

      def builder
        @builder ||= Rack::Builder.new
      end
    end
  end
end

我知道这听起来真的很无聊,但我是Ruby元编程的新手:

  • class << self究竟是什么?这不是App < App吗?
  • 究竟是什么Forwardable?我看着它,但我&#39; M伤感地说我不&#39;吨仍然了解它
  • 为什么应用程序可以向前扩展,什么是可转发?

我知道我的目标是使这一点像Rack::Builder;只是想绕着这一个。

提前致谢。

1 个答案:

答案 0 :(得分:2)

  

App < App究竟是什么?这不是class << self吗?

不,语法self允许您修改对象的元类(在本例中为Forwardable)。这里有一个很好的答案可以解释:class << self idiom in Ruby

  

究竟什么是Forwardable?我看着它,但我&#39; M伤感地说我不&#39;吨仍然了解它

Eldr::App模块允许将发送到一个对象的方法重定向到在该对象上调用方法的结果。在这种情况下,发送到Eldr::App.builder的方法将重定向到Eldr::App.map。因此,当您致电Eldr::App.builder.map时,您实际上是在呼叫extend Forwardable

  

为什么app可以向前扩展?

Forwardable行将Eldr::App添加到Forwardable元类的祖先列表中。这样做只是因为设计使用的可转发性。 Here is a link to Forwardable's documentation。它有一些#include <iostream> #include <string> #include <sstream> #include <fstream> using namespace std; template <typename T1> void toFile(string type, int NumOfElements, stringstream& ss){ T1* myArray = new T1[NumOfElements]; // declaring new array to store the elements int value; for(int i = 0; i < NumOfElements; i++){ // store the elements in the array ss >> value; myArray[i] = value; cout << myArray[i] << " "; } } int main(int argc, char *argv[]) { ifstream ins; ofstream outs; string strg1; string type; int NumOfElements = 0; stringstream inputString; ins.open(argv[1]); if(argc<1) { cout << "please provide the file path." << endl; exit(1); } while (getline(ins, strg1)){ // reading line from the file inputString.clear(); // clearing the inputString before reading a new line inputString << strg1; inputString >> type ; // reading 1st element in a row inputString >> NumOfElements; // reading 2nd element in a row toFile(type, NumOfElements, inputString); } ins.close(); return 0; } 是什么以及如何使用它的例子。