- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
(我已经问过这个问题 at Ruby Forum ,但没有得到任何答案,所以我现在交叉发布)
根据我的理解,下面的代码是等价的Ruby 1.9 及更高版本:
# (1)
case
when x < y
foo
when a > b
bar
else
baz
end
# (2)
if x < y
foo
elsif a > b
bar
else
baz
end
到目前为止,出于习惯,我一直会使用 (2)。有人能想到出于某种特殊原因,为什么 (1) 或 (2) “更好”,或者只是品味问题?
澄清:一些用户反对,这个问题只是“基于意见”,因此不适合这个论坛。因此,我认为我自己说得不够清楚:我不想开始讨论个人编程风格。我提出这个话题的原因是:
令我惊讶的是,Ruby 提供了两种截然不同的语法(target-less case 和 if-elsif),在我看来,它们的目的完全相同,特别是因为 if-elsif 语法实际上是一种语法每个程序员都很熟悉。我什至不会将“无目标 if”视为“语法糖”,因为它不允许我比“if-elsif”更一致地表达编程逻辑。
所以我想知道在什么情况下我可能想要使用“无目标案例”结构。它是否具有性能优势?它与 if-elsif 是否有一些我没有注意到的细微差别?
关于无目标案例实现的其他发现:
Olivier Poulin 指出,无目标的 case 语句会显式使用 === 运算符来对付值“true”,这会导致“case”与“if”相比的(微小)性能损失(还有一个我不明白为什么有人可能想要使用它的原因)。
但是,在查看 Ruby 1.9 和 Ruby 2.0 的 case 语句的文档时,我发现它们的描述不同,但两者至少都表明 === 可能不会在这种情况下使用。在Ruby 1.9的情况下:
Case statements consist of an optional condition, which is in the position of an argument to case, and zero or more when clauses. The first when clause to match the condition (or to evaluate to Boolean truth, if the condition is null) “wins”
这里说,如果条件(即“case”之后的条件)为空(即不存在),则第一个评估为真的“when”子句将被执行。此处未提及 ===。
在Ruby 2.0 ,措辞完全不同:
The case expression can be used in two ways. The most common way is to compare an object against multiple patterns. The patterns are matched using the +===+ method [.....]. The other way to use a case expression is like an if-elsif expression: [example of target-less case is given here].
因此它说 === 以“第一种”方式使用(带有目标的情况),而无目标情况“类似于”if-elsif。这里没有提到===。
最佳答案
Midwire ran a few benchmarks and concluded that if/elsif is faster than case because case “implicitly compares using the more expensive === operator”.
Here是我得到这句话的地方。它将 if
/elsif
语句与 case
进行比较。
它非常详尽,探索了指令序列中的差异,肯定会让您了解哪个更好。
不过,我从帖子中提取的主要内容是 if/else if 和 case 没有巨大差异,两者通常可以互换使用。
根据您的案例数量,可能会出现一些主要差异。
n = 1 (last clause matches)
if: 7.4821e-07
threequal_if: 1.6830500000000001e-06
case: 3.9176999999999997e-07
n = 15 (first clause matches)
if: 3.7357000000000003e-07
threequal_if: 5.0263e-07
case: 4.3348e-07
如您所见,如果匹配到最后一个子句,if
/elsif
的运行速度比 case 慢很多,而 if
匹配第一个子句,反之亦然。
这种区别是因为if
/elsif
使用了branchunless
,而case
使用了 branchif
在它们的指令序列中。
这是我自己用无目标 case
与 if
/elsif
语句(使用“==” ).第一次是case
,第二次是if
/elsif
。
第一个测试,5 个when
语句,5 个if
/elsif
,第一个子句对两者都为真。
Time elapsed 0.052023 milliseconds
Time elapsed 0.031467999999999996 milliseconds
第二个测试,5 个 when
语句,5 个 if
/elsif
,最后一个(第 5 个)子句对两者都为真。
Time elapsed 0.001224 milliseconds
Time elapsed 0.028578 milliseconds
如您所见,正如我们之前所见,当第一个子句为真时,if/elsif 的性能优于 case,而当最后一个子句为真时,case 具有巨大的性能优势。
结论
运行更多测试表明它可能归结为概率。如果您认为答案会在您的子句列表中更早出现,请使用 if
/elsif
,否则 case
似乎更快。
这表明的主要事情是 case
和 if
/elsif
都同样有效,并且使用其中一个比另一个更重要取决于概率和品味。
关于Ruby:无目标 'case' ,与 'if' 相比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31142804/
我经常在 ATS 中看到使用 case、case+ 或 case- 形成的 case 表达式。有什么区别? 最佳答案 如果表达式不详尽,使用 case 会发出警告,case+ 会产生错误,而 case
我有一个导入时全部大写的表,我想将其转换为正确的大小写。你们用什么脚本来完成这个? 最佳答案 这个函数: “正确大小写”由空格分隔的所有“大写”单词 保留“小写单词” 即使对于非英语字母也能正常工作
#include int main() { switch(2) { case 1: if(1)
我已经四处寻找了一段时间,如果我使用的术语不当,请原谅我... 代码的目标是在输入为 0 时更新 Aout1 和 Aout0,输出对应于 7 段显示,但出现以下错误: “错误 (10170):Four
我正在尝试按照 PostgreSQL 手册中的说明进行操作。 PostgreSQL: Documentation: 9.1: Control Structures 我的 PostgreSQL 服务器是
我有一个状态机,其中有几个非常相似的状态。我可以为每个状态编写它,如下例所示: module CHECK_FSM ( GO, DONE, CLK, RESETN ); input GO;
如何使用或创建案例? 就像是: string str; case (str) "abc" || "dfg": begin //some code end "yfg":
这个问题已经有答案了: Are double and single quotes interchangeable in JavaScript? (23 个回答) 已关闭 9 年前。 我正在学习Java
汽车 Make | Model | Year | Color Honda | Accord | 12 | Red Lexus | IS | 14 |
如何使用当前 case 语句的值跳转到 switch-case 条件下的另一个 case 语句? 是否可以使用 switch case 来实现这种事情,或者是否有其他实现方式? 有可能实现吗?如果没有
我理解下面的代码。 var day = 2; switch (day) { case 1: document.write("Monday"); break;
这是有效的。 object FilesToDFDS { case class Student(id: Int, name: String, dept:String) def main(
我对 VHDL 还是个新手。我需要在 CASE 语句中为多个信号赋值,如下所示: CASE input24 IS WHEN "00" THEN output0
我有这个 case 语句,它给出了一个错误“变量 constant1 未使用”。它似乎忽略了变量并返回了第一行,因此变量显然没有范围。如果我用数字 1 替换常量,那么它就可以工作。在 Elixir 中
在 MySQL 中,是否可以在 SELECT 子句中有两个 CASE 语句,其中第二个 CASE 语句依赖于第一个 CASE 语句? 例如,考虑以下查询: SELECT CASE WHEN `user
我正在尝试一个挑战,我需要获得一个随机数,并在没有重复的情况下打印数字内的数字总和:例如,123 将打印 6 ( 1 + 2 + 3 ),而 32111 将做同样的事情(因为我们没有在我们的总和中添加
当有人试图更新当前未存储在我的散列中的值时,我想立即返回 when 'add' 而无需重新启动整个 case声明,因为我已经知道他们想要添加并且不想再次提示他们。 有没有一种方法可以在不重新启动整个案
老 C 程序员可以在 Swift 方面得到一些帮助。 我不太了解 if-case 语法。例如: if case 20...30 = age { print ("in range.") } cas
老 C 程序员可以在 Swift 方面得到一些帮助。 我不太了解 if-case 语法。例如: if case 20...30 = age { print ("in range.") } cas
我有一个 ArrayList,其中包含以下字符串:[name, age, gender, salary] . 有没有办法可以将 ArrayList 中的值用作 case 表达式? 显而易见的答案是否定
我是一名优秀的程序员,十分优秀!