读书的时候,有一段时间,我也曾非常崇拜那些“一行代码过OJ”的大佬,后来逐渐意识到代码的可读性的重要性。尤其是和其他成员合作,写出晦涩难懂的代码只会被称作shit mountain,毕竟工业级别的代码是为了使用,不是为了设计谜语。话说回来,虽是过犹不及,但是对于作为初学者,绝大部分代码值得改进的地方都在于冗余复杂。而精简表达、降低代码长度的重要技巧就是使用“语法糖”。
语法糖(Syntactic Sugar) 是编程语言中一种语法特性,它并不引入新的功能,而是提供一种更简洁、更易读的方式来表达已有的功能。像真正的糖一样,它让代码"尝起来"更甜美。
// 传统for循环
for(int i = 0; i < vec.size(); i++) {
cout << vec[i] << endl;
}
// 范围for语法糖
for(auto& item : vec) {
cout << item << endl;
}
// 显式类型
std::vector<int>::iterator it = vec.begin();
// auto语法糖
auto it = vec.begin();
// 函数对象
struct Compare {
bool operator()(int a, int b) { return a > b; }
};
sort(vec.begin(), vec.end(), Compare());
// Lambda语法糖
sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });
// 传统方式
std::pair<int, string> p = {1, "hello"};
int id = p.first;
string name = p.second;
// 结构化绑定语法糖
auto [id, name] = std::make_pair(1, "hello");
# 传统方式
squares = []
for x in range(10):
squares.append(x**2)
# 列表推导式语法糖
squares = [x**2 for x in range(10)]
# 传统方式
d = {}
for i, v in enumerate(['a', 'b', 'c']):
d[i] = v
# 字典推导式语法糖
d = {i: v for i, v in enumerate(['a', 'b', 'c'])}
# 传统方式
n = len(s)
if n > 10:
print(f"Too long: {n}")
# 海象运算符语法糖
if (n := len(s)) > 10:
print(f"Too long: {n}")
# 传统方式
def my_func():
pass
my_func = decorator(my_func)
# 装饰器语法糖
@decorator
def my_func():
pass
// 传统函数
const sum = function(a, b) {
return a + b;
};
// 箭头函数语法糖
const sum = (a, b) => a + b;
// 传统方式
const person = {name: 'John', age: 30};
const name = person.name;
const age = person.age;
// 解构赋值语法糖
const {name, age} = person;
// 传统字符串拼接
console.log('Hello ' + name + ', you are ' + age + ' years old');
// 模板字符串语法糖
console.log(`Hello ${name}, you are ${age} years old`);
// 传统方式
const street = user && user.address && user.address.street;
// 可选链语法糖
const street = user?.address?.street;
更新啦!Rust 语言语法糖深度解析:优雅背后的编译器魔法
特性 | C++ | Python | JavaScript | Rust |
---|---|---|---|---|
类型推导 | auto | 动态类型 | let/const | let |
解构赋值 | 结构化绑定 | 多重赋值 | 解构赋值 | 模式匹配 |
简洁函数 | Lambda | lambda | 箭头函数 | 闭包 |
空值安全 | 无 | 无 | 可选链 | Option |
循环简化 | 范围for | 推导式 | for…of | iterators |
字符串插值 | 无 | f-string | 模板字符串 | format!宏 |
语法糖让我们的代码更简洁优雅,但记住它们只是表面语法上的简化,底层逻辑并没有改变。理解每种语法糖背后的实际代码,能帮助我们在适当的时候做出正确的选择。