Сейчас едем в Москву, проезжали Бауманку и очень понравился их слоган: Юра, мы все исправим 😃
Добро пожаловать в мир современного фронтенда и базы программирования на канале Kobezzza. Здесь вы найдете интересные и актуальные материалы, подготовленные автором Андреем Кобецем, ведущим разработчиком с 20-летним опытом в области программирования. Андрей делится своими знаниями и опытом, помогая аудитории расширять свои навыки и углублять знания в сфере IT. На канале Kobezzza вы не найдете рекламы, здесь ценится качественный контент и информация, которая действительно будет полезна каждому, кто интересуется программированием. Если у вас есть вопросы или предложения о сотрудничестве, обращайтесь к @kobezzza. Присоединяйтесь к нам и станьте частью сообщества, где развитие и обмен знаниями - важнейшие ценности. Добро пожаловать на канал Kobezzza!
29 Nov, 12:50
29 Nov, 07:44
29 Nov, 06:30
29 Nov, 06:12
28 Nov, 12:03
28 Nov, 06:56
27 Nov, 15:13
27 Nov, 08:52
26 Nov, 16:02
26 Nov, 10:09
25 Nov, 13:45
25 Nov, 09:34
21 Nov, 12:22
href="javascript:void(0)"
. Явно не то, что я ожидал увидеть.href="javascript:void(0)"
будут препятствовать внедрению CSP заголовков на вашем сервисе.<button>
. Использовать href="#"
тоже не надо, т.к. это также нарушение доступности и семантики. 21 Nov, 11:01
const AppRequest = Request.useCredential.header('Content-Type', 'application/json');
const UserRequest = AppRequest.url('/user');
// Создам PUT запрос для создания пользователя
UserRequest.put({name: 'Bob', age: 42}).then(console.log);
Request
, причем UserRequest
за основу использует AppRequest
в котором описаны базовые настройки запросов нашего приложения. А сам запрос уже создается используя терминальный метод put
.const MyStorage = KVStorage.newBucket();
// Где-то в вашем коде
MyStorage.set('key1', data1);
// Где-то в вашем коде
MyStorage.set('key2', data2);
// Где-то в вашем коде
MyStorage.set('key3', data3);
// Создаем объект хранилища, а также серелизуем данные из бакета и сохраняем "за раз"
const dataStorage = MyStorage.create(localStorage, 'myStore');
class MyRequest {
static _state = {};
static url(url) {
const newState = {...this._state, url};
return class extends this { static _state = newState; }
}
static method(method) {
const newState = {...this._state, method};
return class extends this { static _state = newState; }
}
static create(params) {
return new MyRequest({...this._state, ...params});
}
}
MyRequest.url('/example').method('POST').create({body: 'my-data'});
20 Nov, 11:54
import { loadSession } from 'core/init/dependencies/load-session';
import { loadedHydratedPage } from 'core/init/dependencies/loaded-hydrated-page';
import { whenDOMLoaded } from 'core/init/dependencies/when-dom-loaded';
import { dependency } from 'core/init/dependencies/helpers';
export default {
loadSession,
// Этот модуль должен инициализироваться после loadSession
loadedHydratedPage: dependency(loadedHydratedPage, 'loadSession'),
// Этот модуль должен инициализироваться после всех модулей
whenDOMLoaded: dependency(whenDOMLoaded, '*')
};
Promise.all(createDependencyIterator(dependencies).map(([_, {init}]) => init(appState)));
18 Nov, 11:47
<select>
<button>
selected option: <selectedcontent></selectedcontent>
</button>
<option>one</option>
<option>two</option>
</select>
<style>
select, ::picker(select) {
appearance: base-select;
}
</style>
16 Nov, 14:24
16 Nov, 11:45
15 Nov, 18:09
13 Nov, 14:45
12 Nov, 11:27
07 Nov, 10:22
function foo()
42
end
function foo(a:: Int32)
a + Int32(10)
end
function foo(a:: Int64)
a + 100
end
# 42
foo()
# Int32(20)
foo(Int32(10))
# 200
foo(100)
struct User
name:: String;
age:: UInt32;
end
function getName(user:: User)
user.name
end
function getAge(user:: User)
user.age
end
bob = User("Bob", 42)
getName(bob)
07 Nov, 10:22
06 Nov, 09:57
05 Nov, 11:19
01 Nov, 19:06
01 Nov, 16:11
01 Nov, 13:33
31 Oct, 08:38
30 Oct, 19:28
30 Oct, 19:23
30 Oct, 15:20
30 Oct, 09:35
30 Oct, 06:04
29 Oct, 07:58
25 Oct, 10:39
24 Oct, 10:04
@component({functional: true})
class bInput extends iBlock {
@prop(String)
value: string = '';
@field((ctx) => ctx.sync.link('value'))
valueStore: string;
submit() {
// ...
}
}
Object.getOwnPropertyNames
, что также не бесплатно.@defaultValue
.@component({functional: true})
class bInput extends iBlock {
@prop(String)
value: string = '';
@field()
valueStore: string = this.sync.link('value');
}
@component({functional: true})
class bInput extends iBlock {
@defaultValue('')
@prop(String)
value: string = '';
@defaultValue(function () { return this.sync.link('value'); })
@field()
valueStore: string = this.sync.link('value');
}
@method
@component({functional: true})
class bInput extends iBlock {
submit() {
// ...
}
get foo() {
// ...
}
}
@component({functional: true})
class bInput extends iBlock {
@method('method')
submit() {
// ...
}
@method('accessor')
get foo() {
// ...
}
}
24 Oct, 10:04
22 Oct, 14:57
22 Oct, 11:57
22 Oct, 10:48
21 Oct, 11:29
21 Oct, 11:15
18 Oct, 10:23
17 Oct, 13:09
17 Oct, 09:58
--experimental-strip-types
и --experimental-transform-types
для поддержки TS.require
теперь можно использовать для загрузки ESM модулей в синхронном режиме без необходимости использовать top await import
.16 Oct, 15:45
16 Oct, 09:12
15 Oct, 09:39
14 Oct, 11:50
11 Oct, 13:55
10 Oct, 14:08
09 Oct, 17:19
09 Oct, 08:19
08 Oct, 10:25
07 Oct, 14:41
07 Oct, 12:07
fn main() {
let x = 2.0;
// Вызов метода через точку
let y = x.powi(3);
println!("2^3 = {}", y);
// Вызов метода через явную квалификацию
let z = f64::powi(x, 3);
println!("2^3 = {}", z);
}
trait Double {
fn double(self) -> Self;
}
impl Double for i32 {
fn double(self) -> i32 {
self * 2
}
}
fn main() {
let x: i32 = 5;
// Выглядит как новый метод, но это сахар для Double::double(x)
let result = x.double();
println!("Удвоенное значение {} равно {}", x, result);
}
07 Oct, 12:07
+
, -
, .
, []
- это тоже функции из различных характеристик, а значит мы можем их явно реализовывать для любого своего типа. Говоря проще: в Rust есть перегрузка операторов. Причем работает она абсолютно прозрачно.04 Oct, 16:39
03 Oct, 12:52
02 Oct, 19:08