RUBY惯用方法(转)
RUBY惯用方法
目录
- 迭代
- ||=赋值
- 程序入口
- 预设变量和特殊记号
- inject
- 并行赋值
- *的匹配
- rescue简单用法
- 命名参数的默认值
- [精细duck typing控制](#精细duck typing控制)
- 获取metaclass
- 符号转换到Proc
- 随机生成字符串
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惯用方法(转)的更多相关文章
- 安装cocoapods遇到两大坑-Ruby版本升级和Podfile的配置
今天安装cocoapods #移除原有ruby源 $ gem sources --remove https://rubygems.org/ #使用可用的淘宝网 $ gem sources -a htt ...
- 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 ...
- 安装了ruby后怎么安装sass
在命令行中输入 ruby -v 查看版本号 先移除默认的https://rubygems.org源,命令为gem sources --remove https://rubygems.org/,按回车 ...
- ruby 基础知识(一)
突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html 相信初学者会受益颇多 ruby 参考文档 ...
- ruby 基础知识(二)
ruby 中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...
- Ruby安装Scss
Ruby安装Scss 引言 已经许久不写HTML了,今天有点以前的东西要改.但是刚装的Windows10,已经没有以前的Web开发环境了.只好重新安装. 结果Webstorm装好后配置Scss出现错误 ...
- fzf by ruby
fzf by ruby */--> fzf by ruby 1 github地址 https://github.com/junegunn/fzf 2 简介 软件通过匿名管道和grep扩展了bas ...
- The Safe Navigation Operator (&.) in Ruby
The most interesting addition to Ruby 2.3.0 is the Safe Navigation Operator(&.). A similar opera ...
- Ruby on Rails 创建https应用
1. 创建证书请求文件条件:私钥+证书签名请求+opensslyum install -y opensslmkdir /root/ssl/ && cd /root/ssl/openss ...
随机推荐
- 什么是TTL值?(简单明了的解释)
什么是TTL值? TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNS服务器上的缓存时间. 要理解TTL值,请先看下面的一个例子:假设,有这样一个域名myhost. ...
- 求最长公共子串 Longest Common Subsequence
最长公共子串 // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*--------------------------------- ...
- 自动出题判分——c#学习实践
1.程序功能自动出题—(程序随意给出10以内加减乘除)并且判断结果正确与否,正确打对勾,错误打错号. 2.设计界面: 3.代码: using System; using System.Collecti ...
- 列表:List<T>与HashSet和只读集合
一.概述 List<T> 是ArrayList类的等效泛型类.属System.Collections.Generic命名空间. 二.声明及初始化 1.List<T> mList ...
- codeforces 803G Periodic RMQ Problem
codeforces 803G Periodic RMQ Problem 题意 长度为\(1e5\)的数组复制\(1e4\)次,对新的数组进行区间覆盖和区间最小值查询两种操作,操作次数\(1e5\). ...
- VS2013打开项目 提示Asp.net4.5未在web服务器上注册 F5运行 启动不来 权限
打一个补丁 http://blogs.msdn.com/b/webdev/archive/2014/11/11/dialog-box-may-be-displayed-to-users-when-op ...
- IOS 对JSON解析的要求
JOSN格式的原始字符串中, 键名必须为 引号 “” 包含的字符串,值必须是数组("[]" 用中括号包起来的部分),字典("{}" 用中括号包起来的部分),数字 ...
- redis缓存机制【转载】
转载自:http://blog.csdn.net/acmman/article/details/53434134 redis的主从模式(1)介绍redis存储数据是在内存中运行的,运行速度比关系型数据 ...
- android--简单的发短信功能
一.准备字符资源 <string name="tip_phone">请输入电话号码</string> <string name="tip_s ...
- F、CSL 的神奇序列 【规律】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
题目传送门:https://ac.nowcoder.com/acm/contest/551/F 题目描述 CSL 有一个神奇的无穷实数序列,他的每一项满足如下关系: 对于任意的正整数 n ,有 n∑k ...