let obj1 = [{
'id': 1,
'longString': 'Joe - 2011-04-23T18:25:23.511Z'
},
{
'id': 2,
'longString': 'Mary - 2010-04-23T18:25:23.511Z'
}
];
const res = obj1.map(({
id,
longString
}) => ({
id,
name: longString.match(/\w+/)[0],
date: longString.match(/\d+.*/)[0],
}))
console.log(res)
Но в C, нет объектов. Я должен встроить все поведение своей структуры данных Очереди?
Нет.
Сделайте это.
Определите свой класс однако, Вы чувствуете себя комфортно, делая дизайн OO.
Запишите атрибуты своего класса как структура языка C.
Помещенный, что структура в заголовочный файл, наряду со всеми функциями, которые воздействуют на ту структуру. Удостоверьтесь a MyStruct * self
первый аргумент всем этим "функциям метода".
Запишите модуль C со всеми телами функций метода.
OO плохого человека в C. Это работает хорошо. Просто дисциплинируйтесь о помещении всего в структуру, в которой Вы нуждаетесь - общедоступные и частные переменные экземпляра - все.
Обычно постарайтесь не пытаться иметь частные переменные во-первых. У Вас нет полной мощности компилятора OO, не беспокойтесь функциями низкой стоимости как "частный" или "защищенный".
Я исправил бы S. Ответ Lott для использования непрозрачного указателя для выполнения сокрытия данных членов структуры:
typedef struct mystruct_s *mystruct_t; // first argument to all your methods
Умные соглашения о присвоении имен как символы нижнего подчеркивания являются ненужным использованием этого метода, но это означает, что все Ваши членские переменные будут частными. Функции могут быть государственными или частными, хотя государственные функции, они - часть глобального пространства имен, таким образом, Вы могли бы хотеть квалифицировать их имена с именем "пакета" как mystruct_push()
, mystruct_pop()
, и т.д.
Также необходимо прояснить, ответственны ли вызывающая сторона или библиотека за вызов malloc()
и free()
. Скорее всего, Вы будете иметь mystruct_t *create()
и void destroy(mystruct_t *target)
методы.
Можно все еще думать объектно-ориентированные с C.
Просто необходимо создать структуру и ряд функций, которые берут указатель на экземпляр той структуры как ее первый параметр.
Что касается полиморфизма, можно передать размер структуры как первый член структуры, таким образом, Вы знаете, как бросить его.
Существует большой PDF объектно-ориентированного программирования с ANSI-C здесь.
У меня был перенос времени, перемещаясь от процедурного до взглядов OO, таким образом, я чувствую Вашу боль.
Я нашел, что, чтобы изучить, как создать объекты, было лучше думать о том, как они обратятся к вызывающей стороне. Тот же подход мог бы помочь Вам, идя другим путем. Рассмотрите то, на что был бы похож API к Вашему компоненту. Один хороший путь состоит в том, чтобы изучить существующие API C (я использовал стандартные API Java в качестве ряда примеров API OO).
Вы привыкли использовать компонент очереди что-то вроде этого:
import some.package.Queue;
Queue q = new Queue();
q.add(item);
В типичном API C Вы ожидали бы что-то больше как:
#include <queue.h> // provides queue, make_queue(), queue_add(), others
queue q = make_queue(); // queue is probably a struct, or a struct*
queue_add(q,item);
Каждый раз, когда Вы думаете в объектах, сделайте подобное преобразование.
Можно использовать указатели на функции и т.п., для создания подобных объекту структур в C - но много тысяч программистов C справились без.
Удачи!
Первоначально C++ был просто компилятором, который написал код C из источников C++; они были затем скомпилированы собственным компилятором C, связанным, и т.д.
Следовательно, все методы ООП доступны в C - это просто, что компилятор не поможет Вам и не обеспечивает все возможности времени компиляции, такие как шаблоны, переопределения оператора, сокрытие данных, и т.д.
Проверьте Lua C API. Это был мой направляющий свет насколько C дизайн интерфейса идет. Каждая функция берет состояние Lua в качестве ведущего аргумента, который становится Вашим "это". Наследование немного более хитро, но Бурундуку удается сделать, довольно хорошее представление задания функционирует, которые принимают универсальную форму структуры и разрабатывают детали, из которых функция на самом деле вызвана через "klass". Можно часто использовать пусто*, чтобы иметь функции, берут различные типы (структуры) путем, Вы перегрузились бы в OO. Это может время от времени чувствовать немного hackish, но работает хорошо.
Я второй предложения для того, чтобы сделать "OO бедного человека в C." Я также думаю, что Вы могли бы извлечь выгоду из занимания время, чтобы видеть, как OO Perl работает. В основном OO выполняется в Perl при наличии предоставления интерпретатора каждый метод с экземпляром как неявный первый параметр. Вы захотите сделать то же в C, явно, и использование действительно, действительно хорошая организация кода, так как компилятор не осуществит хорошую инкапсуляцию для Вас.
Между прочим, можно осуществить хранение членов структур, частных при помощи непрозрачных указателей. Я, кажется, вспоминаю, что стандарты программирования GNU и рекомендации включали технику для того, чтобы сделать это, в основном бросая все для освобождения*, когда она была роздана, затем с помощью определений типов для именования каждого определенного типа непрозрачного указателя, который, как предполагалось, был передан. (т.е. каждый "класс")
используйте бойкий, c библиотека с ООП http://library.gnome.org/devel/glib/2.20/