Ruby:无目标’案例’,与’if’相比

(我已经问了这个问题 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提供了两种非常不同的语法(无目标情况和if-elsif),因为在我看来,它的目的完全相同,特别是因为if-elsif语法实际上是每个程序员都是熟悉.我甚至不会将’target-less if’视为“语法糖”,因为它不允许我比’if-elsif’更明确地表达编程逻辑.

所以我想知道在什么情况下我可能想要使用’无目标案例’构造.它是否具有性能优势?它是否与if-elsif有些微妙的区别,我才注意到它?

关于实施无目标案件的其他调查结果:

Olivier Poulin指出,一个无目标的case语句会明确地使用===运算符来反对值“true”,与’if’相比,这会导致’case’的(微小的)性能惩罚(和更多的原因,我不明白为什么有人可能想要使用它).

但是,在检查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’之后的条件)为空(即不存在),则计算为true的第一个’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

正如您所看到的,如果最后一个子句匹配,如果/ elsif运行比case慢得多,而如果第一个子句匹配,则反过来.

这种差异来自if / elsif使用branchunless,而case在其指令序列中使用branchif的事实.

这是我自己做的一个测试,使用无目标案例和if / elsif语句(使用“==”).第一次是案例,而第二次是if / elsif.

一个测试,5个语句,5个if / elsif,第一个子句对两个都是真的.

Time elapsed 0.052023 milliseconds                                                                                                                                                                                                                                                                                                                                                                                                       
Time elapsed 0.031467999999999996 milliseconds

第二次测试,5次语句,5次/ elsif,最后一次(第5次)子句对两者都是真的.

Time elapsed 0.001224 milliseconds                                                                                                                                                                                                                                                                                                                                                                                                 
Time elapsed 0.028578 milliseconds

正如您所看到的,正如我们之前看到的那样,当第一个子句为真时,如果/ elsif的性能优于case,而case在最后一个子句为真时具有巨大的性能优势.

结论

运行更多测试表明它可能归结为概率.如果您认为答案将在您的子句列表中提前出现,请使用if / elsif,否则情况似乎更快.

显示的主要事实是,case和if / elsif都同样有效,并且使用一个而不是另一个归结为概率和品味.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


validates:conclusion,:presence=>true,:inclusion=>{:in=>[0,1]}validates:email,:presence=>true,:length=>{:minimum=>3,:maximum=>254},:uniqueness=>true,:email=>truevalidates:ending_order,
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各Master的状态,如果Master异常,则会做主从切换,将Slave作为master,将master做为slave。其配置也较复杂,且表现一般。redis3.0以后已经支持集群容错功能,并且非常简单1.1素材准备centos7(集群搭建,至少三个master。需
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow                 不知道大家是否注意到,全新安装ruby之后,无论是在windows或是linux还是macosX下使用rix
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 modify_my_object!,这个方法名是以!结尾,在ruby的对象里边是用于表达修改本身的意思。比如String#gsub,返回的是一个新的字符串对象;而String#gsub!,返回的是自身已经被修改的对象。不止!这样的特殊字符可以命名,ruby
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质。 什么是编程? 编程即程序员根据需求把自己的思想流程按照某种编程语言的语法风格编写下来,产出的结果就是包含一堆字符的文件。二编程语言分
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编程语言的特性包括:数据封装数据抽象多态性继承这些特性将在面向对象的Ruby中进行讨论。一个面向对象的程序,涉及到的类和对象。类是个别对象创建的蓝图。在面向对象的术语中,您
1.ruby的标签<ruby>漢<rp>(<p><rt>han<t><rp>)<p>字<rp>(<p><rt>zi<t><rp>)<p><uby> 
1、软件安装1.安装包是个压缩包-->解压到/homeedis_tar下命令如下: tar-zxvf./../-C/homeedis_tar2.安装c++环境yum-yinstallgcc-c++(注:redis底层源码是c++)3.解压后需要源码编译进入到redis-3.0.0后执行make4.编译完后开始安装需要指定一个安装路径
1.sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby。(注:mac下自带Ruby无需在安装Ruby!)window下安装SASS首先需要安装Ruby,先从官网下载Ruby并安装。安装过程中请注意勾选AddRubyexecutablestoyourPATH添加到系统环境变量。ruby官网:https:/ubyinstaller.org/downloa
本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTfulAPI项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图。课程简介这是一门企业级项目实战课程,目的是从0使用Rails开发一个企业级RESTfulAPI项目;他不能让你年薪30
注意点:1.redis集群至少需要6个节点。2.redis集群至少部署在3台服务器上。3.redis的版本需要在3.0以上。4.需要ruby的支持。步骤:1.安装依赖环境:yuminstallgcc-c++2.下载ruby-2.4.6,编译安装https://cache.ruby-lang.org/pububy/2.4uby-2.4.6.tar.gztarzxf ruby-2.4.6.
在我的客户项目中,我看到很多睡眠用法0.代码看起来像这样.whiletrue......sleep0end通过阅读SO的一些答案,如this,似乎睡眠0具有一定的意义.我现在想知道的是,在时间片0期间调度其他线程运行(如果它们正在等待运行)是像ruby或python这样的langVM的工作,或者它
前情提要:第11天开始,要更深入Ruby的精髓!Ruby经典面试题目#11Ruby的block,proc,lamdba方法比较?What’sdifferencebetweenblocks,procsandlambdas?block代码内存块代码内存块是用do…end围起来,围出特定一个区域、放代码的地方。就好像跑马拉松一样,道路上会进行交通管制,把参赛者
安装环境及工具系统:RedHatEnterpriseLinuxServer工具:XShell5及Xftp5等远程工具安装包:Ruby-2.4.1及以上       Rubygems-2.6.12及以上       Redis-3.2.8及以上(3.x版本才开始支持集群功能)       Redis-3.0.0-gem及以上(该版本不一定要和red
 今天在做Redis的Cluster集群的时候,在执行geminstallredis时,提示如下错误:geminstallredisERROR:Errorinstallingredis:redisrequiresRubyversion>=2.2.2.CentOS7yum库中ruby的版本支持到2.0.0,可gem安装redis需要最低是2.2.2,采用rvm来更新ruby:1
我试图在Rails4中制作应用程序.我正在挣扎.我正在尝试合并一个bootstrap主题,我遇到了供应商javascripts和其余代码的问题.我认为问题可能与在我的application.js中使用jQuery然后使用以’$’符号开头的供应商.js文件有关:$.circleProgress={我刚看过这个:https://learn.jqu
该内容全部为搬运,感谢作者的分享~,附有原文链接。使用ruby环境SASS学习系列之(一)---------SASS,SCSS环境搭建(Ruby) 使用node-sassSASS学习系列之(二)---------SASS,SCSS环境搭建(node-sass)通过命令编译:npmrunsassinput.scssoutput.csssass-loader在webpack打包里
我如何使用PHP5.3Closures,比如我们在Ruby中使用Blocks.我从来没有在Ruby中使用’for’循环,因为使用带有’each”read_all”inject’方法的块.我如何使用像Ruby块这样的PHP5.3闭包,并说再见’for’Loops
一、说明:搭建Redis集群时,安装geminstallredis报错: redisrequiresRubyversion>=2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem安装redis需要最低是2.2.2二、解决办法:解决办法是先安装rvm,再把ruby版本提升至2.3.31.安装curlsudoyuminstal
compass.app是集成了sass的工具,安装完Compass就能够使用sass。首先,上官网 可以看到官网上推荐的两种sass使用方式,application&commandlineapplication里不仅仅只有Compass,不过现在点击Compass.app进行下载。虽然通常我们说sass运行在Ruby环境下,但Compass.app安装使用并不需要