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

Ruby中&&操作符的妙用(旁门左道)

阅读更多

  几乎所有的现代编程语言都提供了&&操作符,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代码简洁很多。
  (这里,Enumerable中的方法我们就先不考虑了。或许这个例子举得不是很好~)

 

  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...

分享到:
评论
1 楼 liusong1111 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";

相关推荐

Global site tag (gtag.js) - Google Analytics