`
yacole
  • 浏览: 240974 次
  • 性别: Icon_minigender_1
  • 来自: 浙江科技学院
社区版块
存档分类
最新评论

Ruby习惯用法(转载)

阅读更多
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使用。


预设变量
类似$0的Perl风格预设常量还有很多,参见Programming Ruby p319
其中比较常用的如$:代表库搜索路径,修改方法常见有:
代码:

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

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

后一种方法使用了相对路径,因为Ruby的module不要求namespace和文件目录结构要对应一致,很多时候统统放一个目录里


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   

这个njmzhang说的很对,其实函数返回的是一个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里的xMads(haskell), x:Mads(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核心类的扩展,是个有趣而又危险的大杂烩,也许我以后会另外再专门介绍一下。
分享到:
评论
2 楼 yacole 2007-01-07  
我错了-。-#,只是前几天看见就顺便收藏了,没想过那么多!
1 楼 KDr2 2007-01-05  
兄弟,转载起码得注明出处啊,里面提到的人名都一样...弄得跟自己原创一样...呼唤版权意识...
再说,本站文章,从节约资源的角度看,收藏一下就好了吧...

http://www.iteye.com/post/140708

相关推荐

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby-qtbindings允许你在Ruby中使用QTGui工具包

    通过qtbindings,Ruby程序员可以直接调用QT的类和方法,创建复杂的窗口应用、控件、布局和信号与槽机制,而无需离开熟悉的Ruby环境。 这个项目的核心在于其绑定技术,它将C++的QT库转换为Ruby可以理解和操作的对象...

    Ruby 方法、类

    方法在Ruby中是可重复使用的代码块,它们接受参数,执行特定任务,并可能返回值。方法定义使用`def`关键字开始,后面跟着方法名,然后是参数列表(如果有的话),最后用`end`结束。例如,一个简单的输出“Hello, ...

    ruby DBI ruby DBI ruby DBI

    ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...

    ruby使用json库

    如果你需要将Ruby对象转换成JSON字符串,可以使用`JSON.generate`方法。例如: ```ruby require 'json' data = { name: "John", age: 30, city: "New York" } json_string = JSON.generate(data) puts json_...

    ruby2ruby.zip

    ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby

    Ruby资源ruby-v3.1.1.zip

    2. **Symbol to_proc的优化**:Ruby 3.1对`Symbol#to_proc`进行了优化,提高了使用方法引用作为块时的性能。这在处理集合时特别有用,如`array.map(&:method)`。 3. **Ruby编译器改进**:内部编译器的优化使得代码...

    ruby trap 初学者使用

    - Ruby中的块(由`do...end`或`{...}`定义)是代码的可执行部分,可以与方法一起使用。Proc和Lambda是块的两种对象形式,它们可以保存并稍后执行。理解它们的差异,如 Proc的`call`和Lambda的`[]`调用方式,以及对...

    Ruby/tk学习资料

    Ruby/tk是一种基于Ruby语言的图形用户界面(GUI)库,它基于Tcl/Tk工具包并进行了封装以适应Ruby的语法和习惯。 #### 1. 引入Ruby/tk 在使用Ruby/tk之前,首先需要确保已经正确安装了Ruby环境,并且安装了Ruby/tk库...

    Ruby-LazyHighCharts一个简单和非常灵活的方式从ruby代码使用HighCharts

    Ruby-LazyHighCharts是一个针对Ruby编程语言设计的库,它提供了一种简单且高度灵活的方法来利用HighCharts库进行数据可视化。HighCharts是一个广泛使用的JavaScript图表库,用于在Web应用中创建高质量的交互式图表。...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    Ruby完全自学手册 下

    《Ruby完全自学手册》是一本完全覆盖Ruby和Ruby on Rails的完全自学手册。《Ruby完全自学手册》的特色是由浅入深、循序渐进,注重理论和实践的结合。虽然定位为入门手册,但是依然涉及许多高级技术和应用,覆盖到的...

    src-oepkgs/ruby-ruby2ruby

    src-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2...

    Ruby 编程语言的书籍

    1. **类型与数据结构**:介绍Ruby中的各种基本数据类型,如整型、浮点型、字符串等,并深入讲解数组、哈希表等数据结构的使用方法和内部实现原理。 2. **控制流**:讲解条件语句(if/elsif/else)、循环结构...

    Ruby编程Ruby Programming

    - **动态性**:Ruby支持运行时修改代码结构,允许开发者在程序运行过程中改变类和方法的行为。 - **元编程能力**:Ruby提供了一种称为元编程的技术,使得程序可以自我修改和自我扩展。 ### 二、Ruby编程基础 #### ...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    Ruby新手学习书(Ruby语言中文教程)和Rails_4_days

    3. **函数与方法**:了解如何定义和调用函数,以及Ruby中的块、 Proc 和 Lambda 的使用。 4. **面向对象编程**:Ruby是一种纯面向对象的语言,你将学习类、对象、继承、模块、封装和多态等核心概念。 5. **异常...

    Ruby-irbtools改善Ruby的IRB控制台

    irbtools的使用可以显著提高Ruby开发者的工作效率,尤其是在频繁进行测试和调试时。它通过增加各种实用功能,使IRB从一个基本的命令行工具转变为一个功能强大的开发环境。无论你是Ruby新手还是经验丰富的老手,...

    From Java to Ruby

    然而,Ruby鼓励使用异常来控制程序流程,而在Java中,过度使用异常会被视为不良实践。 在开发工具和生态系统方面,Java有成熟的IDE如Eclipse和IntelliJ IDEA,以及Maven和Gradle等构建工具。Ruby则有RubyMine作为...

Global site tag (gtag.js) - Google Analytics