`
vivimusing
  • 浏览: 79839 次
  • 性别: Icon_minigender_1
  • 来自: 台州
社区版块
存档分类
最新评论

Object#returning

阅读更多

      ActiveSupport 是Rails中的无名英雄。那些大量让Rails代码更加漂亮和强大的功能在ActiveSupport中实现。它加了很多在Rails中普遍使用的方法到核心类中。如果你不介意花时间发觉它们,你会学习到各种方便的技巧,且能应用到你的程序中。

先看下下面这个习惯用法

def create_book
  book = Book.new
  book.title = "Trafalgar: The Nelson Touch"
  book.author = "David Howarth"
  @db.add(book)
  book
end

     你创建了一个对象,给对象设置属性,然后返回这个对象。ActiveSupport 中加入了一个可以让习惯用法美化(在某些情况下,简化)的新的方法(叫 returning)到Object中。

def create_book
  returning Book.new do |book|
    book.title = "Trafalgar: The Nelson Touch"
    book.author = "David Howarth"
    @db.add(book)
  end
end

    后者是没有短于前者,但内容更优雅。我感觉更“ Rubyish ” 。有些时候,它可以为您节省几行代码,如果这很重要的。 (只需浏览下Rails代码就能找到更多的例子。 )

    Object#returing在Rails中已在相当长的一段时间,被检测是在2005年3月20号的第949修订 。 (它现在存在于active_support / core_ext /object/ misc.rb ,和原来的略有不同,不过还是很简短)

    找这个方法的注释你会发现“A Ruby-ized realization of the K combinator, courtesy of Mikael Brockman.”

。。。。。。

。。。。。。

。。。。。。

这个实现非常简明扼要:

 

def returning(value)
  yield(value)
  value
end

 

分享到:
评论
2 楼 vivimusing 2009-01-31  
对的就那篇文章。工作中看到returing,不解是什么东西,然后google到《Mining ActiveSupport: Object#returning?》 只翻译了一部分。你对于SKI组合子的解释让我长了见识了,谢谢
1 楼 RednaxelaFX 2009-01-31  
原文是这个么:Mining ActiveSupport: Object#returning?翻译的话可能最好还是给出原文链接比较好 ^ ^

话说这个“K Combinator”,也就是K组合子,算是函数式编程里比较重要的一个东西呢。所谓的SKI组合子能够组合出所有其它的组合子。
用Ruby语法来写,SKI组合子可以这样写:
def I(x)
  x
end

def K(x, &y)
  y[x]
  x
end

def S(x, y, z) # x and y have to be lambdas
  x[z][y[z]]
end

这样的K组合子就跟ActiveSupport里的一样。

Ruby 1.9里的Object#tap也是一个K组合子的实现,与Object#returning不同的是,前者是一个方法,K组合子的第一个参数就是caller,第二个参数是一个block;而后者其实是一个函数,K组合子的第一个参数是这个函数的第一个参数,隐式的第二个参数是一个block,只不过把函数定义在Object里让所有对象都能直接用。
Object.new.tap do |obj|
  def obj.foo
    # ...
  end
end

相关推荐

    findbugs:may expose internal representation by returning

    public Object getContent() { return content; // FindBugs警告就在这里 } } ``` 这里的`getContent()`方法直接返回了私有字段`content`的引用。如果外部代码捕获了这个引用并进行修改,例如: ```java ...

    abap_object.ppt

    METHODS get_value RETURNING VALUE(rv_value) TYPE i. PRIVATE SECTION. DATA lv_value TYPE i. ENDCLASS. ``` **创建类的对象**: - 创建类的对象称为实例化,即基于类模板创建具体的对象。 - 使用`CREATE ...

    findbugs常见Bug以及处理办法

    - **May expose internal representation by returning reference to mutable object**:调用get方法,获得对象属性,获得的对象属性是一个可变的对象。 - **描述**:返回内部可变对象的引用,可能会导致外部实体...

    returning-DOM-elements-javascript-源码.rar

    标题 "returning-DOM-elements-javascript-源码.rar" 暗示了这是一个关于使用JavaScript操作和检索DOM元素的源代码集合。DOM(Document Object Model)是HTML和XML文档的结构化表示,允许通过编程方式访问和修改文档...

    Spring框架+SpringAOP动态代理

    - **最终通知**(After Returning Advice):在连接点正常返回后执行。 下面是一个典型的AOP流程图示例: ```java try { // 前置通知 // 环绕通知 // 调用目标对象方法 // 环绕通知 // 后置通知 } catch ...

    面向方面编程的四种通知接口

    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("后置通知:在目标方法 " + method.getName() + " 返回后调用"); } } ``...

    springAOP中文文档

    在传统的面向对象编程 (Object-Oriented Programming, OOP) 中,业务逻辑往往与其他非核心逻辑(如日志记录、权限检查等)混合在一起,这导致了代码的重复和难以维护。 AOP 的核心思想是将这些横切关注点从业务逻辑...

    JAVA编程规范

    ##### 5.6 返回值(Returning Values) - 明确返回值的类型和意义。 ##### 5.7 条件运算符?前的表达式(Expressions before ‘?’ in the Conditional operator) - 条件运算符(`? :`)用于简单的条件判断。 - 示例: ...

    spring AOP注解的应用1

    public void logReturnValue(Object returnValue) { System.out.println("返回通知:方法 " + "返回了 " + returnValue); } ``` `returning`属性指定了返回值的参数名,可以在通知方法中使用。 ### 异常通知...

    spring mvc学习笔记

    @AfterReturning(value = "execution(String freestyle.login.controller.ServiceTest.testAspect(..))", returning = "res") public void afterReturningMethod(JoinPoint joinPoint, Object res) { // 处理返回值...

    Spring AOP - Advice

    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("方法 " + method.getName() + " 执行成功,返回值为 " + returnValue); ...

    Firebird 2.1 技术手册

    - **RETURNING**:在 DML 语句之后返回结果集,便于链式操作。 通过这些更新,Firebird 2.1 成为了一个更为强大和灵活的关系型数据库管理系统,适用于各种规模的应用程序开发。对于想要深入了解 Firebird 2.1 的...

    spring入门学习-6、AOP几种配置方式详解.pdf

    public void afterReturning(Object returnVal, Method method, Object[] args, Object target) throws Throwable { System.out.println("StudentAfterAdvice: " + method.getName() + " " + target.getClass()....

    Spring AOP 注解使用

    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { // 代码执行前操作 Object result = joinPoint.proceed(); // 执行目标方法 // 代码执行后操作 return result; } ``` ### 2.7 `@...

    7Spring AOP盗梦空间之二——获得返回值AfterReturnning

    public void afterReturningAdvice(Object returnValue) { // 在这里,我们可以对returnValue进行操作 System.out.println("Method returned with value: " + returnValue); } ``` 这里的`returnValue`就是...

    Spring 应用之AOP

    <property name="target" ref="targetObject"></property> <!-- 目标对象 --> <property name="proxyInterfaces" value="targetInterface"></property> <!-- 代理接口 --> ``` #### 四、高级配置 在实际开发过程...

    用注解的方式进行SpringAOP开发

    @AfterReturning(pointcut = "serviceMethods()", returning = "result") public void afterServiceCall(Object result) { System.out.println("Service method finished successfully. Result: " + result); } ...

    基于Red5的录音录像方法和代码

    trace("Server returning Info: " + re.result); } function onState(e:Event):void { trace("State: " + e.target.data); } ``` 以上是基于Red5的录音录像功能实现的核心代码及逻辑说明。通过这些代码示例,...

Global site tag (gtag.js) - Google Analytics