2008-07-09
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...
- 22:30
- 浏览 (88)
- 评论 (1)
- 分类: Ruby/Rails
- 进入论坛
- 相关推荐
评论
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";
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 3597 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
我的相册
theme_dir.PNG
共 14 张
共 14 张
最近加入圈子
链接
最新评论
-
Ruby中&&操作符的妙用(旁 ...
simulate if/elsif or case/when, javascri ...
-- by liusong1111 -
为Rails中的validation e ...
我的目的是将error信息按照某种xml结构形式返回给客户端,而不仅仅是通过&l ...
-- by woody_420420 -
为Rails中的validation e ...
1. article.errors.add( "api", "Error Mes ...
-- by hozaka -
Ruby On Rails-2.0.2源代 ...
强烈支持,又不是搞学术。简单易懂就好
-- by hykouyuu -
为Rails中的validation e ...
1.比如添加 errors 到 “api” 属性 ...
-- by woody_420420






评论排行榜