Пересмотрите старое и выучите новое, вы можете стать влажным
Прежде всего, помните это онлайн -руководство 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;
Обработка <значения> add (const arguments & args)
{
Групповой масштаб;
// ... приходи снова!
}
Аргументы
Это параметр функции. Давайте сначала посмотрим на официальную ручную ссылку V8.
• int length () const
• локальный <значение> оператор [] (int i) const
Мы не заботимся о других, эти двое очень важны! Один представляет количество параметров, передаваемых в функции, а другой - это кронштейны, которые получают доступ к NTH параметр через индекс индекса.
Таким образом, что касается вышеуказанных требований, мы можем приблизительно понять, что args.length () равна 2, Args [0] представляет и arg [1] представляет b. И мы должны судить, что тип этих двух чисел должен быть числом.
Не уверен, что оператор индекса в кронштейне возвращает результат локального <cent>, который является базовым классом всех типов Node.js. Следовательно, если параметры, передаваемые, имеют различный тип, мы должны судить, какие это параметры. Это связано с некоторыми функциями этого типа значения.
• isarray ()
• Isboolean ()
• isdate ()
• isfunction ()
• isint32 ()
• isnativeError ()
• isnull ()
• isnumber ()
• isregexp ()
• ISSTRING ()
• ...
Я не буду перечислять их все, прочитаю остальное самостоятельно. 。:. ゚ (*´∀`) ノ゚.:。
Бросание
Это функция, которую мы будем использовать позже. В частности, его можно найти в документации V8.
Как следует из названия, он бросает ошибку. После выполнения этого оператора он эквивалентен выполнению оператора Throw () в файле Local Node.js. Например:
ThrowException (Exception :: typeError (String :: new («Неправильное количество аргументов»)));
Это эквивалентно выполнению node.js:
бросить новый TypeError («Неправильное количество аргументов»);
Неопределенный()
Эта функция также в документе.
В частности, это нулевое значение, потому что некоторые функции не должны возвращать какое -либо конкретное значение или не возвращать значение. В настоящее время вместо этого необходимо использовать Undefined ().
Примите меры!
Понимая приведенные выше моменты, я считаю, что вы сможете написать логику A + B в ближайшее время. Я скопирую код официального руководства Node.js и прочитаю его для вас. Это будет сделано:
Кода -копия выглядит следующим образом:
#include <node.h>
Использование пространства имен V8;
Обработка <значения> add (const arguments & args)
{
Групповой масштаб;
// это означает, что более 2 параметров могут быть переданы, но на самом деле мы используем только первые два
if (args.length () <2)
{
// бросить ошибку
ThrowException (Exception :: typeError (String :: new («Неправильное количество аргументов»)));
// возвращать пустое значение
return acpope.close (undefined ());
}
// Если один из первых двух параметров не является числом
if (! args [0]-> isnumber () ||! args [1]-> isnumber ())
{
// бросить ошибку и вернуть нулевое значение
ThrowException (Exception :: TypeError (String :: new ("Неправильные аргументы")));
return acpope.close (undefined ());
}
// Для получения подробной информации, пожалуйста, обратитесь к документации V8
// http://izs.me/v8-docs/classv8_1_1value.html#a6eac2b07dced58f1761bbfd53bf0e366)
// `numberValue` Функция
Local <cumber> num = num :: new (args [0]-> numberValue () + args [1]-> numberValue ());
return scope.close (num);
}
Функция выполнена!
Наконец, напишите функцию экспорта в конце, и все будет в порядке.
Кода -копия выглядит следующим образом:
void init (ручка <объекта> экспорт)
{
экспорт-> set (string :: newsymbol ("добавить"),
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;
HARDE <Calue> runCallback (const Arguments & Args)
{
Групповой масштаб;
// ... треснувший потрескивание потрескаться
return acpope.close (undefined ());
}
Затем мы решаем, как это используется так:
func (function (msg) {
console.log (msg);
});
То есть он передаст параметр функции обратного вызова, мы представляем, что это строка, и тогда мы можем консоли.log (), чтобы увидеть ее.
Сначала вам нужна серия строк
Без лишних слов давайте сначала подарим ей строку. (√ ζ ε :)
Но мы должны сделать эту строку общих типов, потому что код node.js слаб.
Local <dathle> :: new (string :: new ("Hello World"));
Что? Вы спрашиваете меня, что такое локальное <значение>?
Затем я немного расскажу об этом, обратитесь к справочным документам отсюда и V8.
Как показывает документация, локальный <t> фактически наследует от handle <t>, и я помню, что предыдущая глава уже говорила о handle <t>.
Тогда вот местный.
Существует два типа ручки, локальная ручка и постоянная ручка, которые являются локальными <T>: ручка <t> и постоянную <t>: ручку <t>. Нет никакой разницы между первым и ручкой <t>, и оба цикла выживания находятся в рамках. Жизненный цикл последнего отделен от масштаба, вам нужно вручную назвать постоянным :: утилизировать, чтобы закончить его жизненный цикл. Другими словами, локальная ручка эквивалентна распределению объектов на стеке на C ++ `, а постоянная ручка эквивалентна выделяющим объектам C ++ на куче.
Тогда вам нужна серия таблиц параметров
Как получить параметры командной строки после вызова C/C ++ в командной строке терминала?
Кода -копия выглядит следующим образом:
#include <stdio.h>
void main (int argc, char* argv [])
{
// ...
}
Кстати, ARGC здесь - это количество параметров командной строки, а ARGV [] - различные параметры. Затем v8 также использует аналогичный метод для функции обратного вызова Call Node.js:
Копия кода следующим образом: v8export local <value> v8 :: function :: call (gange <object> recv,
int argc,
Обработка <значения> argv []
);
~~ QAQ застрял в ручке <object> recv! ! ! Продолжайте писать завтра. ~~
Ну, начинается новый день, и я чувствую, что полон силы. (∩^o^) ⊃━☆゚.*・。。
После того, как я проверил во многих аспектах (Segmentfault, Stackoverflow и QQ Group), я наконец решил значение трех параметров вышеуказанной функции.
Я не буду говорить о двух последних параметрах, один - это количество параметров, а другой - массив параметров. Что касается первого направления параметров <object> recv, то объяснение брата Stackoverflow заключается в следующем:
Это то же самое, что применяется в JS. В JS вы делаете
Кода -копия выглядит следующим образом:
var context = ...;
cb.apply (контекст, [... args ...]);
Объект прошел как первый аргумент, который становится в рамках функции. Больше документации на MDN. Если вы не знаете JS хорошо, вы можете прочитать больше об JS This здесь: http://unschooled.org/2012/03/undersding-javascript-this/
―Cerpted из Stackoverflow
Короче говоря, его функция состоит в том, чтобы указать этот указатель на вызываемой функции. Использование этого вызова аналогично Bind (), Call () и Apply () в JavaScript.
Итак, что мы должны сделать, это сначала построить таблицу параметров, а затем передать функцию вызова для выполнения.
Первым шагом является отображение функции преобразования, потому что она была изначально типом объекта:
Local <faction> cb = local <faction> :: CAST (args [0]);
Второй шаг - создать таблицу параметров (массив):
Local <dathle> 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;
HARDE <Calue> runCallback (const Arguments & Args)
{
Групповой масштаб;
Local <faction> cb = local <faction> :: CAST (args [0]);
постоянный без знака argc = 1;
Local <dathle> argv [argc] = {local <value> :: new (string :: new ("hello world"))};
cb-> call (context :: getCurrent ()-> global (), argc, argv);
return acpope.close (undefined ());
}
void init (Randle <Object> Экспорт, обработка <object> модуль)
{
Module-> set (string :: newsymbol ("exports"),
FunctionTemplate :: new (runCallback)-> getFunction ());
}
Node_module (addon, init)
Отличная работа! Давайте сделаем последние шаги самостоятельно. Что касается вызова этой функции в JS, я упоминал об этом раньше.
Дополнительный
Ну, я чувствую, что мои учебные заметки становятся все более и более безудержными и хотят их сломать ~
Давайте остановимся здесь сегодня. Во время процесса написания заметок, я снова увеличил свою осанку, такую как значение параметра функции вызова.
Если вы думаете, что эта серия учебных заметок полезна для вас, приходите и хорошо проводите время со мной ~ σ> (〃 ° ω ° 〃) ♡ →