Cor*_*erg 103
惯用语意味着遵循该语言的惯例.您希望找到完成任务的最简单,最常用的方法,而不是从不同语言移植您的知识.
使用带附加的循环的非惯用python:
mylist = [1, 2, 3, 4]
newlist = []
for i in mylist:
newlist.append(i * 2)
Run Code Online (Sandbox Code Playgroud)
使用列表理解的惯用python:
mylist = [1, 2, 3, 4]
newlist = [(i * 2) for i in mylist]
Run Code Online (Sandbox Code Playgroud)
Jac*_*esB 28
一些例子:
资源管理,非惯用语:
string content;
StreamReader sr = null;
try {
File.OpenText(path);
content = sr.ReadToEnd();
}
finally {
if (sr != null) {
sr.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
成语:
string content;
using (StreamReader sr = File.OpenText(path)) {
content = sr.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
迭代,非惯用语:
for (int i=0;i<list.Count; i++) {
DoSomething(list[i]);
}
Run Code Online (Sandbox Code Playgroud)
也是非惯用的:
IEnumerator e = list.GetEnumerator();
do {
DoSomenthing(e.Current);
} while (e.MoveNext());
Run Code Online (Sandbox Code Playgroud)
成语:
foreach (Item item in list) {
DoSomething(item);
}
Run Code Online (Sandbox Code Playgroud)
过滤,非惯用:
List<int> list2 = new List<int>();
for (int num in list1) {
if (num>100) list2.Add(num);
}
Run Code Online (Sandbox Code Playgroud)
成语:
var list2 = list1.Where(num=>num>100);
Run Code Online (Sandbox Code Playgroud)
Bil*_*ard 12
惯用语代码是以通用方式为您的语言执行常见任务的代码.它类似于设计模式,但规模要小得多.成语因语言而异.C#中的一个习惯用法可能是使用迭代器迭代集合而不是循环遍历它.没有迭代器的其他语言可能依赖于循环习语.
在PHP中我有时会遇到如下代码:
foreach ($array as $value) {
$trimmed[] = trim($value);
}
return $trimmed;
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式实现:
return array_map('trim', $array);
Run Code Online (Sandbox Code Playgroud)
实际上,这意味着以一致的方式编写代码,即所有在您的代码库上工作的开发人员在编写类似的代码结构时都应该遵循相同的约定。
所以惯用的方式是与其他代码的风格相匹配的方式,非惯用的方式意味着您正在编写那种函数,但是以不同的方式。
例如,如果您要循环一定数量的项目,则可以通过多种方式编写循环:
for (int i = 0; i < itemCount; i++)
for (int i = 1; i <= itemCount; i++)
for (int i = 0; i < itemCount; ++i)
Run Code Online (Sandbox Code Playgroud)
等等
最重要的是所选择的风格被一致地使用。这样人们就会对如何使用它变得非常熟悉和自信,当你发现一个看起来不同的用法时,这可能是引入错误的迹象,也许是一个错误,例如
for (int i = 1; i < itemCount; i++)
Run Code Online (Sandbox Code Playgroud)