我跟随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
吗?我知道我的目标是使这一点像Rack::Builder
;只是想绕着这一个。
提前致谢。
答案 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;
}
是什么以及如何使用它的例子。