Ruby小技巧:处理方法调用中的nil

读blog看到的一个小技巧,原文在这里
    我们常常处理这样的代码:

name=person?person.name:nil

    取某个对象的一个属性,先判断对象是否为nil,不是nil就返回对象属性,否则返回nil。这样的代码写多了比较恶心,是否有比较有趣的方式来减少代码?作者给出了一段代码:

module ObjectExtension
 def nil_or
  return self unless self.nil?
  o = Object.new
  class << o
    def method_missing(sym, *args); nil; end
  end
  o
  end
end
class Object
  include ObjectExtension
end

   上面的代码为Object加入了扩展,为每个对象实例增加了一个nil_or方法,分析下这个方法:如果对象不为nil,马上返回self(也就是对象本身),否则生成一个新的对象,这个对象通过method_missing机制将所有的方法调用都返回nil(原文是用Class.new,生成的类将不会被GC,这里采用回复给出的方案,生成对象,在对象的metaclass上做method_missing)。那么现在代码可以写成:

    name=person.nil_or.name

是不是相当的DSL呢?

文章转自庄周梦蝶  ,原文发布时间 2008-02-19

时间: 2024-10-23 05:24:47

Ruby小技巧:处理方法调用中的nil的相关文章

Ruby处理方法调用中的nil

我们常常处理这样的代码: name=person?person.name:nil 取某个对象的一个属性,先判断对象是否为nil,不是nil就返回对象属性,否则返回nil.这样的代码写多了比较恶心,是否有比较有趣的方式来减少代码?作者给出了一段代码: module ObjectExtension def nil_or return self unless self.nil? o = Object.new class << o def method_missing(sym, *args); nil

几个Ruby小技巧分享

  这篇文章主要介绍了几个Ruby小技巧分享,本文讲解了代码块的序列调用.主要是说array在block中的使用.Hash#fetch.创建代码段的散列等小技巧,需要的朋友可以参考下 代码块的序列调用 代码如下: def touch_down yield [3, 7] puts "touchdown!" end touch_down do |(first_down, second_down)| puts "#{first_down} yards on the run"

PowerShell小技巧之从函数中返回多个值_PowerShell

假设一个PS脚本函数需要返回多个值,最好的办法是返回对象并且存储对象独有的属性. 这里有一个不错的方法.它能轻松的返回你想要的多个信息,并将结果分配给多个变量: function Get-MultipleData { Get-Date 'Hello' 1+4 } $date,$text,$result=Get-MultipleData "The date is $date" "The text was $text" "The result is $resu

Powershell小技巧--将文件夹中的大文件分成若干份_PowerShell

朋友有一文件夹,全部是EML文件,约20G.他需要把这20G文件按每个文件夹2G分成10个.于是乎写了以下脚本: #目标文件夹 $scrfile = "d:\test" #起始目录名 $directory = 0 #1825361100 #76547428 #判断当目录的文件数大于0时while循环为真 while( (dir -Path $scrfile -Filter *.eml ).count -gt 0) { #起始目录名为1 $directory++ #建立目录 New-It

小技巧:在Asp中获取客户端MAC地址的方法

技巧|客户端 本程序属于一种特别的方法.使用范围比较有限,而且有一定的危险性.借鉴了asp后门里的一些方法.下面是程序代码. <%     dim remoteaddr if Request.ServerVariables("HTTP_X_FORWARDED_FOR")=empty then remoteaddr=Request.ServerVariables("REMOTE_ADDR") else remoteaddr=Request.ServerVaria

PHP YII框架开发小技巧之模型(models)中rules自定义验证规则_php实例

YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规则后才能被提交,可以很有效地保证表单安全和信息的有效性.还是给大家具体说明一下: 以下是视图(views)部分的简单代码: <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'tag-form', 'enableAjaxVa

几个Ruby小技巧分享_ruby专题

代码块的序列调用 复制代码 代码如下: def touch_down    yield [3, 7]    puts "touchdown!"  end    touch_down do |(first_down, second_down)|    puts "#{first_down} yards on the run"    puts "#{second_down} yards passed"  end    => "3 ya

每日Ubuntu小技巧:解决VirtualBox中截屏时的黑屏故障

VirtualBox是一个可以让你在一台物理主机上运行多个系统的软件.它支持Windows,Mac OS X 和Linux 并且是Oracle公司在维护它. 我们在这里写了很多关于VirtualBox的文章,你可以做一个快速的查找来查看所有关于VirtualBox的文章. 现在,这里有一个故事:VirtualBox有一个功能,允许用户快速的截取虚拟机会话的屏幕截图.这些截图可以通过粘贴板和宿主机共享. 这就是我们这里要说的了.当某一个Ubuntu 虚拟机中的功能启用后,这项截图的功能就不能够正常

一个减少App Store审核被拒的小技巧--善用iTunes Connect中被遗忘的字段

本文由CocoaChina--zheng0115(社区ID)翻译 作者:@Brenden Mulligan 原文:A simple tip to reduce App Store rejections 在过去的两年中,我们团队在App Store中为7款APP推出了60个发布版本.因此,我们已经熟知什么才是用户在想要的,以及如何定位和营销App以使其获得最高的安装率.经过多次的操作实践后,我们受到启发,开发了LaunchKit工具包,以供App开发者和App市场营销者在发布App时使用. 我们也