RUBY惯用方法

目录

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

迭代

一般写法:

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

习惯写法:

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

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

||=赋值

一般写法:

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

习惯写法:

number ||= 1

程序入口

if __FILE__ == $0

if $PROGRAM_NAME == __FILE__

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

预设变量和特殊记号

类似$0的Perl风格预设常量还有很多,参见Programming Ruby p319

其中比较常用的如$:代表库搜索路径,修改方法常见有:

$:.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}

inject有点难理解,相当于python的reduce和一些FP里的fold。inject的块变量有两个(这里是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}

也就是块变量sum被初始化成0然后反复迭代执行块的内容,最后返回sum

并行赋值

这个很多人都知道了,比如:

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

当然可以延伸出一些很诡异的变化,不提倡使用阿

还有一个用法是让函数返回“多个结果”(不是多个对象),如:

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

其实函数返回的是一个array,然后再并行匹配到变量上去。(所以我对多个结果特别加了引号)

这显然是个syntax sugar,你随便用逗号分割几个变量是不会自动组成array的

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

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

*的匹配

一般来说*用于把一个array展开:

a, *b = [1,2,3]  #a = 1, b = [2,3]

类似FP里的x:xs(haskell), x::xs(ocaml), [a | b] (erlang from 布娃娃)

rescue简单用法

    begin
1/0
rescue
puts 'wrong'
end

可以简化为

1/0 rescue puts 'wrong'

命名参数的默认值

ruby有默认参数,但其实没有所谓keyword argument,而是提供一个syntax sugar用hash模拟。但是怎么像Rails的方法那样同时利用命名参数和默认参数值呢?

def image(opt={})
default_opt = {:height => 25, :width => 10}
default_opt.merge! opt #opt中同样key的内容会覆盖default_opt中key的value
end

精细duck typing控制

duck typing的精神就是行为决定类型,而不是相反

    a = []
#不用
if a.kind_of? Array then a << 1
if a.instance_of? Array then a << 1
#而用
if a.respond_to? :<< then a << 1

获取metaclass

这也比较常见了,各种动态伎俩的开始

sing = class << self; self; end

符号转换到Proc

一般写法:

(1..10).map{|item| item.succ}

习惯写法:

(1..10).map(&:succ)

map(fun(x))般的FP风格

注意这是Rails特有的,通过ActiveSupport对Symbol插入to_proc方法。

不用Rails怎么办呢?一种办法是借助Ruby Facets库(gem install facets):

require 'facet/symbol/to_proc'

Facets库包括大量对Ruby核心类的扩展,是个有趣而又危险的大杂烩

随机生成字符串

('a'..'z').to_a.shuffle[0..12].join

RUBY惯用方法(转)的更多相关文章

  1. 安装cocoapods遇到两大坑-Ruby版本升级和Podfile的配置

    今天安装cocoapods #移除原有ruby源 $ gem sources --remove https://rubygems.org/ #使用可用的淘宝网 $ gem sources -a htt ...

  2. Unable to download data from http://ruby.taobao.org/ & don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

    安装cocoapods,记录两个问题! 1.镜像已经替换成了 http://ruby.taobao.org/, 还是不能不能安装cocoapods, 报错:Unable to download dat ...

  3. 安装了ruby后怎么安装sass

    在命令行中输入 ruby -v 查看版本号 先移除默认的https://rubygems.org源,命令为gem sources --remove https://rubygems.org/,按回车 ...

  4. ruby 基础知识(一)

    突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html    相信初学者会受益颇多 ruby  参考文档 ...

  5. ruby 基础知识(二)

    ruby  中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...

  6. Ruby安装Scss

    Ruby安装Scss 引言 已经许久不写HTML了,今天有点以前的东西要改.但是刚装的Windows10,已经没有以前的Web开发环境了.只好重新安装. 结果Webstorm装好后配置Scss出现错误 ...

  7. fzf by ruby

    fzf by ruby */--> fzf by ruby 1 github地址 https://github.com/junegunn/fzf 2 简介 软件通过匿名管道和grep扩展了bas ...

  8. The Safe Navigation Operator (&.) in Ruby

    The most interesting addition to Ruby 2.3.0 is the Safe Navigation Operator(&.). A similar opera ...

  9. Ruby on Rails 创建https应用

    1. 创建证书请求文件条件:私钥+证书签名请求+opensslyum install -y opensslmkdir /root/ssl/ && cd /root/ssl/openss ...

随机推荐

  1. 模块复习 staticmethod和classmethod的区别

    Python中classmethod与staticmethod区别 classmethod:类方法staticmethod:静态方法 在python中,静态方法和类方法都是可以通过类对象和类对象实例访 ...

  2. [EffectiveC++]item16:Use the same form in corresponding uses of new and delete

  3. 只用最适合的! 全面对比主流 .NET 报表控件:水晶报表、FastReport、ActiveReports 和 Stimulsoft

    前言 随着 .NET 平台的出现,报表相关的开发控件随之出现,目前已经有若干成熟的产品可供开发人员使用,本文旨在通过从不同维度对比目前最流行的4款 .NET报表控件,给所有报表开发人员在做产品选型时一 ...

  4. C++计算器项目的初始部分

    作业代码 https://github.com/How-Come/object-oriented/tree/master/Calculator 一.解题思路 1.Scan类 这次题目的难点在于如何将输 ...

  5. 021.8 properties(开发使用频率高)

    内容:Properties基本存取.存储到持久化设备.从持久化设备读取.简单模拟收费软件试用结束##Properties——有配置文件的功能.    特点:    1.Hash table的子类,ma ...

  6. bzoj5153 [Wc2018]州区划分

    题目链接 正解:子集和变换. 考场上只会暴力和$p=0$的情况,还只会$O(2^{n}*n^{3})$的. 然而这题题面出锅,导致考场上一直在卡裸暴力,后面的部分分没写了..听$laofu$说$O(2 ...

  7. POJ3304 Segments

    嘟嘟嘟 题面就不说了,网上都有. 刚开始理解成了只要有不孤立的线段就算合法,结果就不会了--然而题中要求是所有线段至少有一个交点. 其实想一想就知道,问题转化为了是否存在一条直线和所有线段都有交点. ...

  8. Linux 问题处理集锦

    安装nginx,编译过程中遇到的问题 wget command not found yum -y install wget c compiler cc is not found yum -y inst ...

  9. Fiddler模拟Http请求

    Fiddler模拟Http请求 一.自定义Http请求:

  10. xcode Aborting commit: '~/Pods' remains in tree-conflict 错误的解决办法

    在网上找了很多, 最后找到一个比较简单有较的 filename: 是出错的文件的绝对路径: xcode会提示 然后开终端: 1:svn remove --force filename 2:svn re ...