分享 从别的地方找到的,我估计新手会喜欢的。我整理一下发布

ane · 2014年02月16日 · 最后由 xiaoronglv 回复于 2014年02月17日 · 3491 次阅读

Ruby 有不少惯用法,这里略作一些介绍,也方便阅读他人代码:

迭代 一般写法:

for i in (1..10) 
puts i 
end 

习惯写法:

(1..10).each{|i| puts i}

1.upto(10){|i| puts i} # from njmzhang

||=赋值 一般写法:

number = 1 if number.nil?  
number = 1 unless number 

习惯写法:

number ||= 1

程序入口

if __FILE__ == $0

if $PROGRAM_NAME == __FILE__

这个相当于 main(), 逻辑判断的意思当程序名 ($0 或另一个)和当前文件名 (FILE) 一致时,也就是当前文件是被单独执行的而不是被别的文件调用。这个方法还有个用法是作为 unit test 使用。

预设变量和特殊记号 其中比较常用的如 $:代表库搜索路径,修改方法常见有:

$:.unshift('buildscript')  # from gigix

$: << File.join(File.dirname(__FILE__), 'CurrentClass') 

后一种方法使用了相对路径,因为 Ruby 的 module 不要求 namespace 和文件目录结构要对应一致,很多时候统统放一个目录里. %w 格式化命令 (from qiezi) 可以少打几个引号

w{a b c d} #等价 ['a', 'b', 'c', 'd'] 

(~键下的撇号)用来执行shell外部命令,如: help``

inject 一般写法:

result = []
(1..10).each{|item| result << item}

习惯写法:(1..10).inject([]){|array, item| array << item} nject 的块变量有两个(这里是 array 和 item),第二个变量 (item) 用来枚举被 inject 的集合(这里是 (1..10) 这个 range), 而第一个变量 (array) 由 inject 的参数初始化 (这里是 [],可选),并在 block 被反复执行时保持持久(相当于静态变量),而 item 则在每次枚举时被更新为下一个值。我们再看一下 inject 的另一种通常用法就会更明白了:求和

(1..10).inject{|sum, item| sum += item}
这个等于
(1..10).inject(0){|sum, item| sum += item}

并行赋值

a,b = 0, 1
a,b = b, a  交换a,b

还有一个用法是让函数返回 “多个结果”(不是多个对象),其实函数返回的是一个 array,然后再并行匹配到变量上去 如:

def test
  1,2
end
x, y = test x = 1, y = 2 

注意这种并行匹配当两遍不平衡时会造成的问题:

a,b = [1,2,3] # a = 1, b = 2, 3被丢弃
a,b,c = [1,2] # a = 1, b = 2, c = nil 被初始化成nil 

符号转换到 Proc : 一般写法:(1..10).map{|item| item.succ} 习惯写法: (1..10).map(&:succ) 注意这是 Rails 特有的,通过 ActiveSupport 对 Symbol 插入 to_proc 方法。

这都是应该有的风格啊。。

#1 楼 @iBachue 给新手的,谢谢

#1 楼 @iBachue 我一开始看别人的代码,就觉得迷糊

#3 楼 @u1378130755 我是先读完语法书再看别人代码的

#4 楼 @iBachue 也可以吧,像我这样缺乏想象力的人,管看书不行,书和代码得结合。

#4 楼 @iBachue 走马观花的看看语法书,记个 30%,看看别人的代码,再细看看语法书,轻松不少

#6 楼 @u1378130755 哦 那你可以阅读 Rails 代码 几乎所有乱七八糟的语法现象里面都包含了 很全的

作为新手顶一个……很多都是常见场景…

给新手看是不错 不过不如直接看 ruby style guide https://github.com/styleguide/ruby

wiki 里面有中文版,Ruby 风格指导 - Ruby 官方首推代码风格介绍 http://ruby-china.org/wiki/coding-style

#11 楼 @spacex 你不说,我都忘记了

这不就是 ruby style 吗

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