`
yacole
  • 浏览: 240032 次
  • 性别: 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代码ruby代码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编程,Ruby编程,

    - **核心库和工具**:详细介绍了Ruby标准库中的一些重要模块,如数组、哈希表等,并探讨了常用的Ruby工具和环境配置方法。 - **高级主题**:包括元编程、线程、网络编程等内容,适合想要进一步深入了解Ruby的...

    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笔记1ruby笔记1ruby笔记1

    1. "学ruby的感受.txt":这可能是一个文档,记录了作者在学习Ruby过程中的个人感受、体会,可能包括学习方法、遇到的挑战、解决办法等。从中我们可以了解到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编程Ruby Programming

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

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

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

    Ruby资源ruby-v3.1.1.zip

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

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

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

Global site tag (gtag.js) - Google Analytics