`

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呢?

0
1
分享到:
评论
2 楼 dennis_zane 2008-04-23  
很别扭吗?我觉的相当自然
1 楼 dazuiba 2008-04-22  
难道你不觉得这么做很别扭?

相关推荐

    ruby-pardot:用Ruby编写的Pardot API客户端

    将以下内容添加到您的Gemfile中 gem "ruby-pardot" 用法 身份验证 为了使用此客户端,必须指定从Salesforce OAuth检索的访问令牌。 有关更多信息,请参见[ 身份验证文档]( /)。 require "ruby-pardot" version...

    trace_calls:跟踪方法调用的整个链

    追踪电话跟踪方法调用的整个链。安装将此行添加到您的应用程序的Gemfile中: gem 'trace_calls' 然后执行: $ bundle或将其自己安装为: $ gem install trace_calls用法require 'open-uri'require 'trace_calls'...

    ruby_parser:ruby_parser是用纯Ruby编写的Ruby解析器。 它输出可以通过ruby2ruby gem进行操纵并转换回ruby的s表达式

    ruby_parser 家 虫子 博士 描述: ruby_parser(RP)是用纯Ruby编写的Ruby解析器(利用racc,默认情况下使用C扩展名)。 它输出可以通过ruby2ruby gem进行操纵并转换回ruby的s表达式。 举个例子: def ...

    Ruby编程语言

     4.4方法调用89  4.5赋值92  4.6操作符100  第5章语句和控制结构117  5.1条件式118  5.2循环127  5.3迭代器和可枚举对象130  5.4代码块140  5.5改变控制流146  5.6异常和异常处理154  5.7BEGIN和END165 ...

    ruby-knn:用Ruby编写的简单kNN分类器

    Ruby-knn 用Ruby编写的简单kNN分类器 用法 将宝石捆绑在您的项目中,然后按照以下说明进行操作。 # Gemfile gem 'knn' , git : 'git@github.com:jonmidhir/ruby-knn.git' # Elsewhere require 'knn' 或者您可以...

    Ruby菜鸟入门指南.md

    5. Ruby中"一切皆方法调用",没有直接访问属性的方式,只有方法调用。 6. 变量命名约定,如局部变量、常量、实例变量、类变量等。 7. 方法命名约定,如?结尾表示返回布尔值,!结尾表示会修改对象。 8. 块(Block)的...

    ruby-tuples:从函数式编程中了解元组的Ruby实现

    从函数式编程已知的元组的Ruby实现。 元组将固定数量的项目组合在一起,以便它们可以作为整体传递。 与数组或列表不同,元组可以容纳不同类型的对象,但它们也是不可变的。 安装 将此行添加到您的应用程序的...

    fluent-logger-ruby, 用于Fluentd的结构化记录器( ruby ).zip

    fluent-logger-ruby, 用于Fluentd的结构化记录器( ruby ) 录音机 结构化事件记录器示例简单require 'fluent-logger'log = Fluent::Logger::FluentLogger.new(nil, :host =&gt; 'localhost',

    ruby2json:简单的在线工具,可将ruby JSONhash控制台输出转换为正确的JSON。 https:ruby2json.herokuapp.com

    Ruby2JSON转换器简单的在线工具,可将ruby JSON /哈希控制台输出转换为正确的JSON。 例如{"ruby"=&gt;"json"}转换为{ "ruby" : "json" }工作流程解析器非常幼稚。 解析过程如下: 拆下线制动器,将线连接成单线。 翻译=...

    ruby-koans:通过http学习Ruby

    鲁比·科恩斯(Ruby Koans) // 去做 // 去做 Koan名称 完全的? about_asserts :check_box_with_check: about_nil :check_box_with_check: about_objects :check_box_with_check: about_arrays :check...

    ios-清理模型中的nil.zip

    清理字典转模型后模型中的nil,属性多于字典,服务器返回为null等情况

    ruby-hysh:黄鹰的Ruby外壳

    RubyHYSH Ruby HYSH代表黄英在Ruby中的SHell。 Bash交互式Shell和脚本是使用Linux / Unix的非常重​​要的工具。 但是我不喜欢bash的语法,宁愿在Ruby中这样做。 这项工作基于HYSH(黄鹰在Common Lisp中的SHell: )...

    delegate_it:非 Rails 项目中 ActiveSupport 委托方法的替代品

    #委托 delegate_it gem 提供了一种在非 Rails 项目中使用 ActiveSupport 之类的delegate方法的简单方法。安装在您的 Gemfile 中: gem 'delegate_it'用法 require 'delegate_it'class Cowboy extend DelegateIt attr...

    Rails的邮件预览引擎MailsViewer.zip

    配置方法: config.action_mailer.delivery_method = :file config.action_mailer.file_settings = { location: 'tmp/mails', smtp_settings: { address: "localhost", port: 25, domain: 'localhost....

    objective-c小技巧

    objective-c小技巧 1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法。 直接调用成员变量并且给其赋值:member=[NSString stringWithFormat...

    ipcat-ruby:client9ipcat的Ruby端口

    ipcat-ruby 库的ruby端口,用于对来自已知数据中心的IP地址进行分类 安装 使用捆绑器: # In Gemfile gem 'ipcat' 或与Ruby: gem install ipcat 用法 IPCat . datacenter? ( ip_address ) 如果ip_address来自...

    ios开发小技巧

    读者可能知道一个简易的方法,那就是在程序的viewDidLoad中加入 [[UIApplication sharedApplication]setStatusBarHidden:YES animated:NO]; 33. 更改AlertView背景 UIAlertView *theAlert = [[[UIAlertViewalloc] ...

    nil_or:执行除非 Nil

    将方法委托给目标,除非为零。 安装 将此行添加到应用程序的 Gemfile 中: gem 'nil_or' 然后执行: $ bundle 或者自己安装: $ gem install nil_or 用法 我什么时候需要它? 而不是写: date_of_birth = ...

    ruby-bdb:Guy Decoux的Sleepycat Berkeley DB和DB XML的Ruby绑定

    Oracle分发的Berkeley DB的Ruby接口 先决条件 db&gt; = 2(db 使用--with-db-dir=$prefix选项指定此扩展名应与哪个libdb链接。 笔记 当bdb&gt; = 0.5.5时,“ nil”被存储为空字符串(不使用封送时)。 使用打开数据库 ...

    Ruby简明教程之判断语句介绍

    条件判断,在编程语言中都存在,而Ruby中的条件判断和Java中类似,当然还是存在些许差别 Ruby中条件判断的条件: 1) 可以使用 ==,&lt;,&gt;等比较运算来作为条件,比较运算可以返回true和false,这和java中的语法是...

Global site tag (gtag.js) - Google Analytics