- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 D 编译器中,“final switch
”构造在 D 中的普通 switch
之上提供了哪些额外的优化可能性(如果有的话)? (DLang)
最佳答案
简答:无。
长答案:初级优势final switch
在 switch
是当您将它与枚举类型的值一起使用时,当您缺少其中一个枚举成员时,它会给您一个错误,因此您可以确保涵盖了所有成员。如果枚举发生变化,成员增多或减少,您就会知道需要更新 switch
。声明。
除此之外,在语义上,一个 final switch
与 switch
几乎相同带有 default
的语句有 assert(0)
的情况- 只是它抛出一个 SwitchError
而不是断言 0
.效果本质上是一样的——你的程序在 switch
时终止。语句被赋予一个值,该值未包含在任何情况下。
我真正想到使用 final switch
的唯一原因使用枚举以外的任何东西,这样您就不必编写 default
case
时的情况陈述应该涵盖所有可能的情况。考虑到至少在某些时候,您可以通过断言提供比 SwitchError
更有意义的消息。给你( No appropriate switch clause found
),我倾向于争辩说最好有一个明确的 default
带assert(0)
的箱子和消息而不是使用 final switch
当switch
语句不对枚举进行操作。
现在,关于您关于优化的问题,我认为 final switch
没有任何机会提供对正常 switch
的任何优化.为了抛出 SwitchError
当final switch
被赋予的值未包含在任何 case
中报表,final switch
必须降低到正常 switch
带有 default
的语句抛出 SwitchError
的情况.
因此,就生成的代码而言,final switch
之间确实没有区别。和正常的 switch
有一个 default
抛出 SwitchError
的情况,和优化方面,final switch
在与switch
类似的船上带有 default
的语句断言 0
的案例(尽管 assert(0)
可能比抛出 SwitchError
更可能导致优化,因为编译器可以假设程序将在显式声明为 false
时终止,而程序可以 捕获 Error
并继续,即使它不应该)。
我不知道编译器是否可以根据 default
的保证进行任何优化。如果它被击中, case 将终止程序。如果可以,那么可以通过使用 final switch
获得一些优化。 , 但一个普通的 switch
用default
断言 0
的案例或者扔一个Error
将与final switch
在同一条船上.所以,final switch
并没有什么神奇之处在这方面。 final switch
的魔力正在用枚举捕捉错误。
真的,我建议你只使用 final switch
当您处理具有一组固定值的枚举类型时,您可以在案例与枚举成员不匹配时捕捉到,除此之外,您只是不使用 final switch
.老实说,我很惊讶地发现 final switch
接受枚举以外的任何东西。
关于switch-statement - D 开关优化可能性 (DLang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134416/
我不知道如何在 D 中调用“..”运算符。我见过它: // Slicing int[] t = list[3..$]; // Looping foreach (x; 1..10) {} 但似乎我不能在
我有以下 D 程序,该程序应该将输入行分组为大小为 3 的组。 import std.stdio; import std.range; import std.array; void main() {
所以我只是看一下发布在 dlang 网站上的示例:http://dlang.org/rdmd.html并希望做一些类似于第二个版本的事情,您将 #!/usr/bin/env rdmd 定义为文件的第一
我有这段代码来检查字符串是否有 j 个字符 import std.stdio; void main() { const string name = "john"; for (int i
我正在尝试使用 Dlang 运行 OpenGL 示例。 void onError(int code, const(char)* text) nothrow { } 用法: glfwSetErrorCa
我有一个看起来像这样的结构: struct MultipartMessage { ubyte[] mime, data; Header header; void setSend
我在理解 D 中的模板时遇到了一些麻烦。 我了解 struct Foo(T) { }或类或函数的等价物,但 template Bar(T) { } 是什么? ?它与类、结构或函数模板有何不同,我什么时
我想写一个聊天服务器。 使用编程语言D。(Dlang) 希望使用OOP。 我的例子。(不起作用) import std.stdio; import std.concurrency; import co
如何对 D 中的用户定义对象数组进行排序? 来自 C++ 背景,我想您必须为数组中存储的类型声明一个运算符重载,或者使用比较器函数... 如果有一个如何做到这一点的例子,我们将不胜感激。 最佳答案 你
通过使用 Ruby,我们可以做到这一点。 s = "split by space" A,B,C = s.split(" ").map(&:to_i) 使用 D-lang,它是编译错误。 string
有没有办法不用重复写this(parent class args) {super(parent class args);}当参数完全相同时? 编码: class Parent { string n
第一次海报。我已经使用 Java 几年了,并决定学习 D。在 Java 中,您可以声明一个具有泛型类型的类,并从该类创建一个新对象。喜欢: public class foo { public
import std.range : cycle; void foo() pure @safe { cycle([1, 2]); } 今天遇到一个用D语言写的程序。我试图从一个简单的函数开始理
在 D 编译器中,“final switch”构造在 D 中的普通 switch 之上提供了哪些额外的优化可能性(如果有的话)? (DLang) 最佳答案 简答:无。 长答案:初级优势final sw
来自 https://dlang.org/library/std/typecons/nullable.html : auto auto nullable(T) ( T t ); 什么是“双自动”?
我正在尝试将以下 C# 代码转换为 D,但是我不知道如何使模板约束起作用。 C# 实现 public interface IComponent { } public class Container {
我从 bin 文件中读取了这段代码。数据保存在一个结构数组中并以 null 结尾我的目标是读取用 c 代码编写的数据 write (filehandle, (char *)arrayOfCELLs,
我想从关联数组中获取任何键/值对并将其删除。 在python中它是: key, value = assoc.popitem() 在 D 我做: auto key = assoc.byKey.front
我的代码中有以下行: static if (typeof(val) == string) { 它没有编译并返回错误 Error: incompatible types for ((string) ==
使用 D,我怎样才能将函数(可能是对函数的引用)作为参数传递给在其他函数中执行? import std.stdio : writeln; class Event {} class EventTarge
我是一名优秀的程序员,十分优秀!