分享 发起一个讨论. 你喜欢使用 unless 和 until 吗?

zw963 · 2012年03月01日 · 最后由 xds2000 回复于 2012年03月03日 · 6471 次阅读

就像我认为 Ruby 从 Perl 那里集成了一些很优秀的东西,而有些不懂 linux 的人却 认为那是 Perl 的糟粕。我想你们知道我指的是什么。

同样的,据我所知,很多程序员 (尤其是从其他语言转过来的程序员), 很讨厌 unless 和 until, 大多数情况下,他们总是使用 if 和 while 替换。

我先说下我个人见解: 个人认为 unless, 和 if 绝对是最 Rubiful 的特色之一,也是 Ruby 优雅性体现。

我这样说的依据是:

就 Ruby 这种倾向于使用自然语言方式编程的超级语言而言,罪不可饶恕的 就是在编程过程中,上下文的连贯性被打断。

我试图通过示例来讲解我的意思,不过没有上下文环境,不过很难找到合适的示例. 就简单讲一下我的理解吧。

  1. 使用 unless, until 可以很好的配合 Ruby 中的大量用于验证的 API, 使代码编 写更优雅。例如:常见的 nil? defined?

  2. 第二条,我觉得也是精华,就是使用 unless, until, 隐喻的含义是: 不管三七二十一,先执行其中的语句再说!除非 XXX..., 这种思想,在修饰形式 的 unless 和 until 发挥到了极致。

上下文环境语句.
  (承接上下文环境, 你想做的事) (除非) (发生了什么....)
end

结论就是:在 Ruby 中,unless 和 until, 绝不仅仅是 if 和 while 的取反,而是思想 层面的升华,Ruby 不要求你这样一定做,但是就像社区中常说的那样,但这就是 ruby 的世界观。


楼下继续呀。欢迎不同的意见。

我也是不喜欢unless,通常用if not代替,如果在 rails 的话unless @foo.blank?会用if @foo.present?这样的方式代替

until, unless 的确接近于自然语言。但对于这种“除非”语言,人们还是习惯于先把他们在心里转为 while 和 if 后来理解。就像很多人听老外说英语都是先在心里把英语翻译成汉语后来理解。所以如果 if,while 能搞定,就不要用 unless,until

如果判断的条件是单一的,就用 unless 或者 until 比如 puts hello unless hello.nil?

如果是复杂的,就避免用,否则不是很容易读懂 比如

puts hello unless hello.nil? && x > 0 || !array.empty?

我也偏向使用语言的通用表达式,而不是使用特性,这样代码更容易理解一些

#3 楼 @hisea 嗯,我也是简单的会用 unless 和 until,明明是更加接近自然语言,我们看起来却总是觉得没有那么好理解~

同 1 楼,if 好读些

我一般不用 until 和 unless,但是我认为这是以前编程留下的思维定势,如果我一开始接触的语言就有这个,应该会频繁用的

看当然的语境来使用,如果偏重于是,则用 if, 如果偏重于否就用 unless 我喜欢的一点是,可以把 if 放后面,这种后插看起来爽。

#8 楼 @hhuai 哈哈~ 你的最后一句比较猛 :>

@zw963 上下文环境语句. (承接上下文环境,你想做的事) (除了) (发生了什么....) end 我觉得 除了 好理解点 除非我半天 绕不过弯,不过我是这样想的 if not 就是 unless 嘿嘿 我用 unless 就是觉得 这个 有点拽

irb(main):003:0> hello=1
=> 1
irb(main):004:0> puts hello unless hello.nil?
1
=> nil
irb(main):005:0> puts hello if hello.nil?
=> nil
irb(main):006:0> puts hello if not hello.nil?
1
=> nil
irb(main):007:0> hello.nil?
=> false

果断翻译成 if not

现在用 unless 习惯了。

话说用了 ruby 才知道 unless = if not -_-####

我发这个帖子的根本目的,是希望以前不喜欢用 unless 和 until 的朋友,按照我 的思路理解一下 unless 或 until, 也许会发现一种不一样的感觉。

最后期望的结果就是:不要那么排斥 unless 和 until, 改用的时候就用。

另外说起来,Ruby 还有一个特点就是:一个方法有很多别名,很多人也很诟病, 我倒觉得别名不全是坏事,这就是 Ruby 的风格。不同的语境,使用不同的别名。

我喜欢用 unless,但是有些同事不喜欢,所以为了避免给他们阅读代码时带来麻烦,我会尽量不用

都不喜欢,重来不用。

挺喜欢 unless 的,但是不喜欢 until。感觉上这要看不同人说话的习惯了吧。

几乎从来不用。不过总看到别人用。

哪個順眼用哪個。

我不喜欢 unless 的主要原因是我在中问表达的时候都很少用“除非”这个词语。

要是可以直接!取反,那就是没必要的 否则,总比 while not 和 if not 强。

until 就没用过, unless 在 refactor 代码时用过,用它的目的无外乎就是减少一行。 语法这个东西看看就好。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号