옛날을 수정하고 새로운 것을 배우면 젖을 수 있습니다.
우선, V8 -http://izs.me/v8-docs/main.html 의이 온라인 매뉴얼을 기억하십시오.
마지막 Building.gyp 파일을 기억하십니까?
코드 사본은 다음과 같습니다.
{
"대상": [
{
"Target_name": "addon",
"소스": [ "addon.cc"]
}
]]
}
이와 마찬가지로 한 예에서 배우고 배우십시오. 더 많은 *.cc 파일이 있으면 다음과 같습니다.
"소스": [ "addon.cc", "myexample.cc"]
마지막으로 두 단계를 분리했으며 실제로 구성과 컴파일을 정리할 수 있습니다.
$ node-gyp 구성 빌드를 구성합니다
검토를 마쳤습니까? 없이? !
좋아, 그럼 계속하자.
목차
함수 매개 변수
이제 우리는 마침내 매개 변수에 대해 이야기 할 것입니다.
결과를 반환하기 위해 A와 B를 추가하는 기능 추가 (A, B)가 있다고 상상해 봅시다. 먼저 기능 외부 프레임을 작성하십시오.
코드 사본은 다음과 같습니다.
#include <node.h>
네임 스페이스 V8 사용;
<value> 추가 (const arguments & args)
{
핸들 스코프 범위;
// ... 다시 오세요!
}
논쟁
이것은 함수의 매개 변수입니다. V8의 공식 수동 참조를 먼저 살펴 보겠습니다.
• int length () const
• 로컬 <value> 운영자 [] (int i) const
우리는 다른 사람들에 대해 신경 쓰지 않습니다.이 두 사람은 매우 중요합니다! 하나는 함수에서 전달되는 매개 변수의 수를 나타내고, 다른 하나는 첨자 인덱스를 통해 N 번째 매개 변수에 액세스하는 브래킷입니다.
위의 요구 사항에 관해서는, 우리는 args.length ()가 2, args [0]은 a를 나타내고 args [1]은 b를 대략적으로 이해할 수 있습니다. 그리고 우리는이 두 숫자의 유형이 숫자 여야한다고 판단해야합니다.
확실하지 않음, 브래킷의 인덱스 연산자는 모든 유형의 node.js의 기본 클래스 인 로컬 <value>의 결과를 반환합니다. 따라서 전달 된 매개 변수가 다양한 유형 인 경우 매개 변수가 어떤 매개 변수인지 판단해야합니다. 이것은이 값 유형의 일부 기능과 관련이 있습니다.
• isarray ()
• isboolean ()
• isdate ()
• isfunction ()
• ISINT32 ()
• isnativeError ()
• isnull ()
• isnumber ()
• isregexp ()
• isstring ()
• ...
나는 그들 모두를 나열하지 않을 것이며 나머지를 혼자 읽으십시오. 。 :.
ThrowException
이것은 나중에 우리가 사용할 함수입니다. 특히 V8 문서에서 찾을 수 있습니다.
이름에서 알 수 있듯이 오류가 발생합니다. 이 명령문을 실행 한 후 Local Node.js 파일에서 Throw () 문을 실행하는 것과 같습니다. 예를 들어:
ThrowException (Exception :: typeError (String :: new ( "잘못된 수의 인수"));
Node.js를 실행하는 것과 같습니다.
새로운 TypeError를 던지십시오 ( "잘못된 수의 인수");
한정되지 않은()
이 기능은 문서에도 있습니다.
구체적으로, 일부 함수는 특정 값을 반환 할 필요가 없거나 값을 반환하지 않기 때문에 널 값입니다. 현재 undefined ()를 대신 사용해야합니다.
조치를 취하십시오!
위의 요점을 이해 한 후에는 곧 A + B의 논리를 쓸 수 있다고 생각합니다. Node.js 공식 설명서의 코드를 복사하여 읽을 것입니다. 완료됩니다 :
코드 사본은 다음과 같습니다.
#include <node.h>
네임 스페이스 V8 사용;
<value> 추가 (const arguments & args)
{
핸들 스코프 범위;
// 2 개 이상의 매개 변수를 전달할 수 있음을 의미하지만 실제로 우리는 처음 두 개만 사용합니다.
if (args.length () <2)
{
// 오류를 던집니다
ThrowException (Exception :: typeError (String :: new ( "잘못된 수의 인수"));
// 빈 값을 반환합니다
return scope.close (undefined ());
}
// 처음 두 매개 변수 중 하나가 숫자가 아닌 경우
if (! args [0]-> isnumber () ||! args [1]-> isnumber ())
{
// 오류를 던지고 널 값을 반환합니다
ThrowException (예외 :: typeError (String :: new ( "잘못된 인수"));
return scope.close (undefined ());
}
// 자세한 내용은 v8 문서를 참조하십시오
// http://izs.me/v8-docs/classv8_1_1value.html#a6eac2b07dced58f1761bbfd53bf0e366)
//`숫자 값 '함수
Local <number> num = number :: new (args [0]-> 숫자 value () + args [1]-> 숫자 value ());
반환 범위 .Close (num);
}
기능이 완료되었습니다!
마지막으로, 수출 기능을 마지막에 쓰면 괜찮을 것입니다.
코드 사본은 다음과 같습니다.
void init (handle <botorport> 내보내기)
{
Exports-> set (String :: Newsymbol ( "add"),
functionTemplate :: new (add)-> getFunction ());
}
node_module (addon, init)
컴파일 후에는 다음과 같이 사용할 수 있습니다.
코드 사본은 다음과 같습니다. var addon = require ( './ build/release/addon');
console.log (addon.add (1, 1) + "b");
당신은 2B를 볼 수 있습니다! ✧。٩ () و✧*.
콜백 함수
이전 장에서는 Hello World에 대해서만 이야기했습니다. 이 장에서 할머니 마스터는 양심으로 그것을 발견하고 콜백 기능을 썼습니다.
컨벤션의 경우 먼저 프레임 워크를 작성해 봅시다.
코드 사본은 다음과 같습니다.
#include <node.h>
네임 스페이스 V8 사용;
<value> runcallback 핸들 (const arguments & args)
{
핸들 스코프 범위;
// ... Cracky Crackle Crackle Crackle Crackle Crackle Crackle Crackle
return scope.close (undefined ());
}
그런 다음 다음과 같이 사용되는 방법을 결정합니다.
func (함수 (msg) {
Console.log (MSG);
});
즉, 매개 변수를 콜백 함수로 전달하고 문자열이라고 생각하고, 콘솔을 볼 수 있습니다.
먼저 문자열 시리즈가 필요합니다
더 이상 고민하지 않고 먼저 끈을 먹자. (√ ζ ε :)
그러나 Node.js 코드가 약하기 때문에이 일반 유형을 만들어야합니다.
Local <value> :: new (String :: new ( "Hello World"));
무엇? 지역 <value>가 무엇인지 묻습니다.
그런 다음 그것에 대해 조금 이야기 할 것입니다. 여기에서 참조 문서와 V8을 참조하십시오.
문서에서 알 수 있듯이 Local <T>는 실제로 <T>에서 상속을 받았으며, 이전 장에서 이미 HANDER <T>에 대해 이야기했음을 기억합니다.
그런 다음 여기 지역이 있습니다.
로컬 <t> : hange <t> 및 영구 <t> : <T>. 전자와 핸들 사이에는 차이가 없으며 생존주기는 모두 범위 내에 있습니다. 후자의 수명주기는 범위와 분리되므로 수명주기를 끝내기 위해 persistent :: dispose를 수동으로 호출해야합니다. 다시 말해, 로컬 핸들은 C ++`의 스택에 객체를 할당하는 것과 동일하며 영구 핸들은 힙의 C ++ 할당 물체와 동일합니다.
그런 다음 매개 변수 테이블 시리즈가 필요합니다
터미널 명령 줄에서 C/C ++를 호출 한 후 명령 줄 매개 변수를 얻는 방법은 무엇입니까?
코드 사본은 다음과 같습니다.
#include <stdio.h>
void main (int argc, char* argv [])
{
// ...
}
그건 그렇고, 여기서 ARGC는 명령 줄 매개 변수의 수이며 Argv []는 다양한 매개 변수입니다. 그런 다음 V8은 유사한 메소드를 사용하여 Node.js의 콜백 함수를 호출합니다.
코드 사본은 다음과 같습니다.
int argc,
<value> argv [] 처리
);
~~ Qaq은 <botort> recv에 핸들에 갇혀 있습니다! ! ! 내일 계속 글을 쓰십시오. ~~
글쎄, 새로운 날이 시작되고 나는 힘으로 가득 찬 것 같습니다. (⊃━☆゚^o^) ⊃━☆゚.*・。。
여러 측면에서 확인한 후 (Segmentfault, StackoverFlow 및 QQ Group) 위의 함수의 세 매개 변수의 의미를 해결했습니다.
마지막 두 매개 변수에 대해서는 이야기하지 않습니다. 하나는 매개 변수 수이고 다른 하나는 매개 변수 배열입니다. 첫 번째 매개 변수 핸들 <botort> recv의 경우 StackoverFlow Brother의 설명은 다음과 같습니다.
JS에 적용되는 것과 동일합니다. JS에서는 그렇습니다
코드 사본은 다음과 같습니다.
var context = ...;
cb.apply (context, [... args ...]);
첫 번째 인수가 함수 범위 내에서 이기면 객체가 전달되었습니다. MDN에 대한 더 많은 문서. JS를 잘 모른다면 JS의 this here에 대해 자세히 알아볼 수 있습니다 : http://unschooled.org/2012/03/understanding-javaScript-this/
- StackoverFlow에서 발췌
요컨대, 그 기능은 호출 된 함수에 대한이 포인터를 지정하는 것입니다. 이 호출의 사용은 JavaScript의 bind (), call () 및 apply ()와 유사합니다.
따라서 우리가해야 할 일은 먼저 매개 변수 테이블을 빌드 한 다음이 호출 기능을 실행하기 위해 전달하는 것입니다.
첫 번째 단계는 원래 변환 함수를 표시하는 것입니다. 원래 객체 유형 이었기 때문입니다.
Local <function> cb = local <function> :: cast (args [0]);
두 번째 단계는 매개 변수 테이블 (배열)을 만드는 것입니다.
Local <value> argv [argc] = {local <value> :: new (String :: new ( "Hello World"))};
기능 시리즈에 대한 마지막 호출
CB를 호출하고 매개 변수를 전달하십시오.
cb-> call (context :: getCurrent ()-> global (), 1, argv);
여기서 첫 번째 매개 변수 컨텍스트 :: getCurrent ()-> global ()은 글로벌 컨텍스트 의이 함수를 얻는 것을 의미합니다. 두 번째 매개 변수는 매개 변수 테이블의 숫자입니다 (결국 Node.js의 배열은 길이 속성을 가지고 있지만 시스템은 실제로 C ++의 배열 길이를 알지 못하며 배열의 길이를 설명하기 위해 숫자로 전달해야합니다). 마지막 매개 변수는 방금 설정 한 매개 변수 테이블입니다.
최종 챕터 엔드 파일 시리즈
모든 사람이 이미이 단계에 익숙하고 기능을 작성한 다음 수출 기능에 넣고 마침내 선언한다고 생각합니다.
코드를 게시하거나 Node.js 문서로 이동하여 읽으십시오.
코드 사본은 다음과 같습니다.
#include <node.h>
네임 스페이스 V8 사용;
<value> runcallback 핸들 (const arguments & args)
{
핸들 스코프 범위;
Local <function> cb = local <function> :: cast (args [0]);
const 부호없는 argc = 1;
Local <value> argv [argc] = {local <value> :: new (String :: new ( "Hello World"))};
cb-> call (context :: getCurrent ()-> global (), argc, argv);
return scope.close (undefined ());
}
void init (핸들 <객체> 내보내기, 핸들 <객체> 모듈)
{
module-> set (String :: Newsymbol ( "Exports"),
functionTemplate :: new (runcallback)-> getFunction ());
}
node_module (addon, init)
잘하셨어요! 마지막 단계를 직접 가자. JS 에서이 함수를 호출하는 것에 관해서는 이전에 언급했습니다.
추가의
글쎄, 나는 내 연구 노트가 점점 더 무제한이되어서 그들을 깨고 싶다고 생각한다 ~
오늘 여기서 멈추자. 연구 노트를 작성하는 과정에서 통화 함수의 매개 변수 의미와 같이 자세를 다시 증가 시켰습니다.
이 일련의 연구 노트가 당신에게 도움이된다고 생각한다면, 나와 함께 즐거운 시간을 보내십시오 ~ σ> (〃 ° ω ° 〃) ♡ →