浏览 2214 次
锁定老帖子 主题:Ruby中&&操作符的妙用(旁门左道)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-09
几乎所有的现代编程语言都提供了&&操作符,ruby也不例外。我想每个人都知道&&的用法。但是在ruby中,利用&&可以实现一些“诡异”的用法,如下例子: 1. 基于这样一个事实:几乎ruby中的所有expression都有返回值(甚至if,case等等),例如:
a = 10 + 20 # => 30 some_bool = true # => true 利用这样的事实,怎么和&&一起“妙用”呢?现在假设有一个数组,比如[1,2,3,"woody",4,"woody"],我们要写一段程序,在遍历数组的时候,如果碰到元素"woody",则将其打印出来,但是只打印一次;如果是其他元素,则执行其他操作。通常,在其他语言中,我们会使用一个flag来完成,比如: flag = false arr = [1,2,3,"woody",4,5,"woody"] for e in arr if e == "woody" && !flag p e flag = true end end 在ruby中,我们可以利用上面提到的原理,如下编码: flag = false arr = [1,2,3,"woody",4,5,"woody"] for e in arr p e if e == "woody" && !flag && (flag = true) end if?flag=true?通常其他程序员看到这样的代码会坚信是错误的,C#在编译过程就会报错。但是,在ruby中,你确实可以使用这样的“九阴真经”。尽管,这可能不是一个好的编程习惯,但是,在一些情况下,这样做确实可以使你的ruby代码简洁很多。
2. 同样还是基于expression的返回值,考虑如下代码: (1+2)&&(3+4) #=> 7 ruby会对&&左右的expression进行计算,至于返回值,当然如果左端操作不为nil或者false的话,就返回右端计算结果。这里,如果结合Array的构造函数,我们可以用如下代码,十分简洁的生成斐波那契数列:
x,y = 0,1 Array.new(10) {|i| [0,1].include?(i) ? 1 : (x,y = y,x+y)&&(x+y) } #=>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 反正我是想了半天,没想到在C,C++或者C#中使用什么高级方法能写出更简洁的代码 3... 4... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-08-22
simulate if/elsif or case/when, javascript(jQuery) code:
status = isTimeout == "timeout" && "timeout" || !jQuery.httpSuccess( xml ) && "error" || s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" || "success"; |
|
返回顶楼 | |