就像我认为 Ruby 从 Perl 那里集成了一些很优秀的东西,而有些不懂 linux 的人却 认为那是 Perl 的糟粕。我想你们知道我指的是什么。
同样的,据我所知,很多程序员 (尤其是从其他语言转过来的程序员), 很讨厌 unless 和 until, 大多数情况下,他们总是使用 if 和 while 替换。
我先说下我个人见解: 个人认为 unless, 和 if 绝对是最 Rubiful 的特色之一,也是 Ruby 优雅性体现。
我这样说的依据是:
就 Ruby 这种倾向于使用自然语言方式编程的超级语言而言,罪不可饶恕的 就是在编程过程中,上下文的连贯性被打断。
我试图通过示例来讲解我的意思,不过没有上下文环境,不过很难找到合适的示例. 就简单讲一下我的理解吧。
使用 unless, until 可以很好的配合 Ruby 中的大量用于验证的 API, 使代码编 写更优雅。例如:常见的 nil? defined?
第二条,我觉得也是精华,就是使用 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?
@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
我发这个帖子的根本目的,是希望以前不喜欢用 unless 和 until 的朋友,按照我 的思路理解一下 unless 或 until, 也许会发现一种不一样的感觉。
最后期望的结果就是:不要那么排斥 unless 和 until, 改用的时候就用。
另外说起来,Ruby 还有一个特点就是:一个方法有很多别名,很多人也很诟病, 我倒觉得别名不全是坏事,这就是 Ruby 的风格。不同的语境,使用不同的别名。