`

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的25个编程细节(技巧、实用代码段)

    在Ruby中,`try` 方法是一个非常有用的功能,它允许我们安全地访问对象的方法或属性,即使该对象为 `nil` 也不会抛出异常。相反,如果没有找到对象或者对象为 `nil`,`try` 会返回 `nil`。 **示例代码:** ```ruby ...

    Ruby-Ruby技巧惯用Ruby重构和最佳实践

    1. 块和迭代器:Ruby中的块(blocks)和迭代器(iterators)是其强大之处。使用`each`、`map`等方法可以简洁地遍历集合。例如,`array.each { |item| puts item }`用于打印数组的所有元素。 2. 魔术方法:Ruby允许...

    ios-清理模型中的nil.zip

    标题"ios-清理模型中的nil.zip"所涉及的内容就是关于如何在模型转换过程中有效地处理这些`nil`或`null`值,以避免程序运行时出现异常。 描述中提到的"清理字典转模型后模型中的nil,属性多于字典,服务器返回为null...

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

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

    06Ruby 方法.docx

    ### Ruby 方法详解 ...Ruby 的方法机制非常灵活,支持多种参数定义方式、默认参数以及返回值处理等。此外,通过 `alias` 语句,可以在不改变原有逻辑的基础上轻松重命名方法,进一步增强了 Ruby 的灵活性和易用性。

    Ruby Reference Sheet.pdf

    - **表达式与语句:** 在Ruby中,所有的表达式都有值,即使是`nil`。因此,表达式与语句之间并无区别。 - **函数与块** - **匿名函数定义:** Ruby提供了多种方式来定义匿名函数(也称为块),应用时可以根据需要...

    自己研究的runtime知识和一些方法调用,KVO的原理

    2. **消息传递机制**:Objective-C中的方法调用本质上是消息传递。当发送一个消息给对象时,Runtime会查找对应的方法实现并执行。如果找不到,会尝试使用`forwardInvocation:`进行转发,或者抛出异常。 3. **动态性...

    iOS调用系统相机

    在iOS开发中,调用系统相机是一项常见的功能,允许用户拍摄照片或选择已有的图片进行应用内处理。本文将深入探讨如何在iOS应用中实现这一功能,主要涉及的知识点包括: 1. **UIImagePickerController**: 这是苹果...

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

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

    Ruby_Assignments:来自Juhomi的Ruby分配

    6. **方法**:Ruby中的函数被称为方法,定义方法使用`def`关键字,如`def say_hello; puts 'Hello!'; end`。 7. **控制结构**:包括条件语句(如`if`、`unless`、`case`)、循环(`for`、`while`、`until`、`times`...

    Ruby语言中文教程.rar

    - 构造函数与析构函数:Ruby中的初始化方法(initialize)相当于构造函数,对象销毁时不会自动调用析构方法。 3. **块、迭代器与闭包** - 块:Ruby中的块是一段可以传递给方法的代码,通常以do...end或花括号{}...

    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-Programming:Ruby基础学习

    方法是Ruby中的重头戏,可以定义自己的函数,参数传递可以是位置参数、默认值参数、可变参数(*args)和关键字参数。 4. **类与对象** Ruby是面向对象的语言,一切皆对象。类是创建对象的蓝图,可以使用`class`...

    iOS 调用外部程序

    在iOS中,调用外部程序主要通过`UIApplication`类的`openURL:`方法(在iOS 10及以上版本需使用`open(_:options:completionHandler:)`方法)。下面是一个简单的示例,展示如何打开一个网页: ```swift if let url = ...

    Ruby入门介绍

    - **方法调用**: 方法调用时,括号可选。 - **示例**: `puts capitalize`与`puts(capitalize)`效果相同。 - **默认参数**: 定义方法时可以为参数指定默认值,如`def greet(name = "World")`。 #### 总结 本文通过...

    ruby-2.3.3tar.gz

    2. **Hash Destructuring (哈希解构)**:在方法调用或赋值时,可以直接将哈希解构为变量,简化了处理键值对的过程。 3. **Syntax for Proc and Lambda (Proc和Lambda的语法)**:引入了`-&gt;`箭头操作符,可以更简洁地...

    iOS相机摄像头的调用

    `UIImagePickerController`是Apple的UIKit框架中的一个类,主要用于处理图像选择或捕获。它可以让你的应用程序访问用户的设备摄像头,或者让用户从照片库中选取图片或视频。`UIImagePickerController`提供了一个预设...

    delphi调用asp.net中的WebService 实例

    6. **处理返回结果**:大多数Web方法会返回一个值,这个值可以通过方法调用后的返回类型获取。如果是XML响应,可能需要解析XML以提取所需信息。 7. **错误处理**:在调用WebService时,可能会遇到网络问题、权限...

    调用系统相机或系统相册里的图片

    // 在UIImagePickerControllerDelegate方法中处理选取的图片 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { ...

Global site tag (gtag.js) - Google Analytics