`
debbbbie
  • 浏览: 26873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Unless , 被滥用的Ruby条件

阅读更多

有些人恨Ruby的unless。 我个人并不这样, 但是我尽力遵守一些规则。 我会用下面都一些例子来澄清这些规则。 下面例子里我标榜为“ok”的只是我的个人喜好,所以我不愿意把它们标榜为“good”, 但是我肯定会避免使用“bad”来标榜它们。

 

 

Statement Modifier…Ok

在使用statement modifier(条件修饰符)的时候,我认为unless实际上比if! 更好读。例如:

raise InvalidFormat unless AllowedFormats.include?(format)

...比这个更好读…

raise InvalidFormat if !AllowedFormats.include?(format)

我认为我喜欢前一个句式的原因是因为它机会对任何人来说读上去都像一个句子,即使是那些不熟悉Ruby的人(就像我的妈妈,大家都知道妈妈能读懂代码的重要性--译者注:要写出高度可读的代码

没有用到Else…Ok

当使用一个条件或者没有用else的时候,我也不介意去使用unless,就像这样 。。。

unless foo?
# bar that thing
end

当使用Else的时候…Bad

我们不喜欢用unless是使用else条件句的时候,就像这样:

unless foo?
# bar that thing
else
# foo that thing
end

如果你有类似的代码, 只需要把功能代码交换一下位置,然后使用if吧。 相信我,这样更可读性更好。

if foo?
# foo that thing
else
# bar that thing
end

使用if的版本比使用unless的版本感觉更容易处理。 我认为使用unless加else条件句就好像在讲双重否定。这会减慢未来程序员使用这段代码, 因为他必须去思考这段代码如何讲的通,而不是顺着条件去看。

当使用nil?的时候...Bad

正如 Ryan Bates 在回复里指出的 , 像这样测试nil…

unless foo.nil?
# do some foo
end

...这样更可读…

if foo
# do some foo
end

unless foo.nil? 和 if foo 是同一个功能,但是是一个双重否定的问题, 像我提到的使用unless...else句式一样。感谢Ryan提到的另一个使用unless 不好的技巧。 

使用多个条件时…Bad

我恨(是恨,而不仅仅是像上面说的一样厌恶)unless的原因,是使用多个条件时候,我总是忘记这个“否定”是仅用在第一个条件还是所有条件。如果只是想这个“否定”不是应用到所有的条件,而只是告诉它让我再次感到困惑,所以请别这么做。。

unless foo? && baz?
# bar that thing
end

相反,我可能会这么做 。。。

if !foo? || !baz?
# bar that thing
end

最后的思考

用unless是ok的,但是不要把它瞎j8扔到你的代码里。I said “nil” get it?(等待眉批) Hehe.一些人说,如果unless这么容易被滥用,那么尽量避免使用它就好了。我猜我不会同意这种说法的,因为我认为在一些情况下,它实际上会提高代码的可读性,正如我上面所述。随你们争辩去吧, 我会无视你的。 :)

分享到:
评论

相关推荐

    04Ruby 条件判断.docx

    ### Ruby条件判断知识点详解 #### 一、Ruby简介与特性 **Ruby** 是一种动态、面向对象的编程语言,以其简洁、易读的语法而著称。它被誉为“程序员最好的朋友”,这得益于其设计思想中的人性化理念,旨在让程序员...

    ruby语法基础教程及Ruby教程中文版和安装文件

    Ruby提供了条件语句(如`if`和`unless`)、循环(如`for`、`while`和`until`)以及`case`语句。例如: ```ruby # 条件语句 if num > 0 puts "这是一个正数" elsif num puts "这是一个负数" else puts "这是一个...

    express-unless, 有条件地添加一个中间件来表达一些.zip

    express-unless, 有条件地添加一个中间件来表达一些 满足条件时有条件跳过中间件。安装npm i express-unless --save用法使用现有中间件:var unless = require('express-unless');var sta

    ruby学习的源码

    - 控制结构:包括条件语句(如if、unless)、循环(如for、while、until、each)和流程控制(break、next、redo、retry)。 2. **Ruby on Rails核心概念**: - ActiveRecord:Rails的ORM(对象关系映射),它将...

    ruby语言帮助文档(简体中文)

    4. **控制结构**:Ruby有各种控制结构,包括条件语句(if/else/unless)、循环(for、while、until、each)、和异常处理(begin/rescue/ensure/else)。 5. **块和闭包**:Ruby的块是代码段,可以通过`do..end`或`{...

    Ruby In a Nutshell

    - `if`、`unless`用于条件判断,`case`语句提供多条件分支。 - `for`、`while`、`until`用于循环,`each`迭代器是Ruby中常用的遍历工具。 - `break`、`next`和`redo`控制循环流程。 3. **函数和方法** - Ruby中...

    Ruby 基础

    条件语句如`if`、`unless`用于根据条件执行代码块,而`case`语句则提供了一种多选项的控制流。循环结构包括`for`、`while`和`until`,以及Ruby特有的`each`迭代器,它在处理集合数据时非常有用。 Ruby的函数和方法...

    ruby语法自整理

    - `if`和`unless`:用于条件判断,`unless`相当于`if not`。 - `while`循环:在条件满足时重复执行代码块。 - `until`循环:在条件不满足时重复执行代码块。 - `for`循环:常用于遍历数组或集合。 - `each`循环...

    Programming Ruby 1.9 (3rd edition)和源码

    - 条件语句:`if`、`unless`、`case`等用于条件判断。 - 循环:`for`、`while`、`until`、`times`和`loop`等。 - 例外处理:`begin`、`rescue`、`ensure`用于异常处理。 5. **Ruby标准库**: - File系统操作:...

    ruby 中文 教程 从入门到精通

    - **条件判断与循环语句**:如`if`、`unless`、`case`、`while`、`for`等,用于控制程序流程。 - **类与对象**:Ruby中的一切都是对象,类是对象的模板,可以定义属性和方法。通过继承和多态机制,可以构建复杂的...

    ruby使用文档

    - `if`、`unless`用于条件判断,`case`用于多条件分支。 - `while`、`until`用于循环,`for`用于遍历,`loop`用于无限循环。 - `break`、`next`、`redo`用于控制循环流程。 3. **函数与方法**: - Ruby中函数和...

    Ruby - Ruby for Rails

    - **条件语句**:讲解 if、unless 等条件语句的使用方法。 - **循环结构**:介绍 while、for、each 等循环语句,以及它们之间的区别。 - **异常处理**:探讨 Ruby 中的异常处理机制,包括 raise 和 rescue 关键字的...

    ruby开发文档

    7. **控制结构**:Ruby有多种控制结构,包括条件语句(if/else/unless)、循环(for、while、until、times)和迭代器(each、map等)。Ruby的case语句支持模式匹配。 8. **异常处理**:Ruby使用`begin/rescue/else/...

    关于ruby学习的资料

    3. 控制结构:学习如何使用循环(如`for`、`while`和`each`)、条件语句(如`if`、`unless`)和异常处理(如`begin-rescue-end`)。 4. 核心库和标准库:了解Ruby内置的库和模块,如`Enumerable`、`File`和`Net`。 ...

    Ruby完全自学手册光盘里的源代码

    2. 控制结构:Ruby中的条件语句(如if/else、unless)和循环(如while、for、each)是控制程序流程的关键。在源代码中,你会看到这些结构的实际应用。 3. 函数:Ruby中的函数定义简单直观,可以用于封装可重用的...

    ruby语法

    4. **控制结构**: Ruby有标准的控制结构,如条件语句(`if`、`unless`)、循环(`for`、`while`、`until`、`each`)和开关语句(`case`)。 5. **块与迭代器**: Ruby中的块是一段可重复执行的代码,通常与迭代器...

    为何Ruby 1.9的不兼容性会导致原有Ruby代码无法工作

    在处理不同长度的数组时,多余的元素在Ruby 1.9中会被忽略。 这些变化给现有代码带来了挑战,开发者需要对代码进行修改以确保在1.9环境中正常运行。例如,Sam Ruby针对REXML库进行了兼容性调整,James Edward Gray ...

    Ruby语言规范

    - **简化条件**:简化条件表达式,如使用`unless`代替`if !`,以提高代码可读性。 - **条件语句**:尽可能使用`case`语句替换复杂条件分支。 **示例**: ```ruby if x > 0 puts "x > 0" else puts "x end ...

Global site tag (gtag.js) - Google Analytics