读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呢?
分享到:
相关推荐
将以下内容添加到您的Gemfile中 gem "ruby-pardot" 用法 身份验证 为了使用此客户端,必须指定从Salesforce OAuth检索的访问令牌。 有关更多信息,请参见[ 身份验证文档]( /)。 require "ruby-pardot" version...
追踪电话跟踪方法调用的整个链。安装将此行添加到您的应用程序的Gemfile中: gem 'trace_calls' 然后执行: $ bundle或将其自己安装为: $ gem install trace_calls用法require 'open-uri'require 'trace_calls'...
ruby_parser 家 虫子 博士 描述: ruby_parser(RP)是用纯Ruby编写的Ruby解析器(利用racc,默认情况下使用C扩展名)。 它输出可以通过ruby2ruby gem进行操纵并转换回ruby的s表达式。 举个例子: def ...
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分类器 用法 将宝石捆绑在您的项目中,然后按照以下说明进行操作。 # Gemfile gem 'knn' , git : 'git@github.com:jonmidhir/ruby-knn.git' # Elsewhere require 'knn' 或者您可以...
5. Ruby中"一切皆方法调用",没有直接访问属性的方式,只有方法调用。 6. 变量命名约定,如局部变量、常量、实例变量、类变量等。 7. 方法命名约定,如?结尾表示返回布尔值,!结尾表示会修改对象。 8. 块(Block)的...
从函数式编程已知的元组的Ruby实现。 元组将固定数量的项目组合在一起,以便它们可以作为整体传递。 与数组或列表不同,元组可以容纳不同类型的对象,但它们也是不可变的。 安装 将此行添加到您的应用程序的...
fluent-logger-ruby, 用于Fluentd的结构化记录器( ruby ) 录音机 结构化事件记录器示例简单require 'fluent-logger'log = Fluent::Logger::FluentLogger.new(nil, :host => 'localhost',
Ruby2JSON转换器简单的在线工具,可将ruby JSON /哈希控制台输出转换为正确的JSON。 例如{"ruby"=>"json"}转换为{ "ruby" : "json" }工作流程解析器非常幼稚。 解析过程如下: 拆下线制动器,将线连接成单线。 翻译=...
鲁比·科恩斯(Ruby Koans) // 去做 // 去做 Koan名称 完全的? about_asserts :check_box_with_check: about_nil :check_box_with_check: about_objects :check_box_with_check: about_arrays :check...
清理字典转模型后模型中的nil,属性多于字典,服务器返回为null等情况
RubyHYSH Ruby HYSH代表黄英在Ruby中的SHell。 Bash交互式Shell和脚本是使用Linux / Unix的非常重要的工具。 但是我不喜欢bash的语法,宁愿在Ruby中这样做。 这项工作基于HYSH(黄鹰在Common Lisp中的SHell: )...
#委托 delegate_it gem 提供了一种在非 Rails 项目中使用 ActiveSupport 之类的delegate方法的简单方法。安装在您的 Gemfile 中: gem 'delegate_it'用法 require 'delegate_it'class Cowboy extend DelegateIt attr...
配置方法: config.action_mailer.delivery_method = :file config.action_mailer.file_settings = { location: 'tmp/mails', smtp_settings: { address: "localhost", port: 25, domain: 'localhost....
objective-c小技巧 1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法。 直接调用成员变量并且给其赋值:member=[NSString stringWithFormat...
ipcat-ruby 库的ruby端口,用于对来自已知数据中心的IP地址进行分类 安装 使用捆绑器: # In Gemfile gem 'ipcat' 或与Ruby: gem install ipcat 用法 IPCat . datacenter? ( ip_address ) 如果ip_address来自...
读者可能知道一个简易的方法,那就是在程序的viewDidLoad中加入 [[UIApplication sharedApplication]setStatusBarHidden:YES animated:NO]; 33. 更改AlertView背景 UIAlertView *theAlert = [[[UIAlertViewalloc] ...
将方法委托给目标,除非为零。 安装 将此行添加到应用程序的 Gemfile 中: gem 'nil_or' 然后执行: $ bundle 或者自己安装: $ gem install nil_or 用法 我什么时候需要它? 而不是写: date_of_birth = ...
Oracle分发的Berkeley DB的Ruby接口 先决条件 db> = 2(db 使用--with-db-dir=$prefix选项指定此扩展名应与哪个libdb链接。 笔记 当bdb> = 0.5.5时,“ nil”被存储为空字符串(不使用封送时)。 使用打开数据库 ...
条件判断,在编程语言中都存在,而Ruby中的条件判断和Java中类似,当然还是存在些许差别 Ruby中条件判断的条件: 1) 可以使用 ==,<,>等比较运算来作为条件,比较运算可以返回true和false,这和java中的语法是...