`
qiezi
  • 浏览: 497674 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[ROR] &:id这种用法

    博客分类:
  • Ruby
阅读更多
这是ActiveSupport扩展的一个方法。原代码如下:

class Symbol
  def to_proc
    Proc.new { |*args| args.shift.__send__(self, *args) }
  end
end

它扩展出这种用法:

(1..5).map(&:to_s)

map原本是要接受一个block参数,普通的用法是:

(1..5).map{|e| e.to_s}

或者:

proc = Proc.new{|e| e.to_s}
(1..5).map(&proc)

上面这个(1..5).map(&:to_s)用法可以拆成3步来解释:
sym = :to_s
proc = Proc.new{|*args| args.shift.send(sym, *args)}
(1..5).map(&proc)

有个疑问,经过yanping.jia解释,map(&:to_s)因为出现了&符号,所以:to_s会执行to_proc方法,然后与&一起合成&proc交给map处理。虽然说得通,不过我总觉得这个解释中,&这个符号做了2次工作,是否合理?

这种用法原本是Ruby Extensions Project发明的,在RoR中作了点修改。原来的版本是:

class Symbol
    def to_proc
      proc { |obj, *args| obj.send(self, *args) }
    end
end

它使用2个参数来分出一个参数,而RoR版本则使用shift分出来。


刚才又想了一下,yanping.jia的解释应该是合理的,解释器看到&:id时,先会判断是否是一个方法调用,如果是则需要把:id转成一个proc。否则就是语法错误了。
分享到:
评论

相关推荐

    ROR 文件的上传与下载

    如果需要将文件存储在服务器磁盘上而不是数据库中,可以修改`save`方法以使用`File.open`方法将文件写入磁盘上的特定路径。 以上就是基于Ruby on Rails实现文件上传与下载功能的完整流程。通过合理的数据库设计、...

    ror培训第2天 object1

    在`initialize`方法中,我们可以使用这些参数来设定实例变量的初始值,如`@cust_id=id`,`@cust_name=name`,`@cust_addr=addr`。 5. **示例代码** - 如创建`Customer`类的两个对象`cust1`和`cust2`,并分别初始化...

    RubyOnRails做的博客

    6. 测试驱动开发(TDD):RoR鼓励使用TDD,即先编写测试,再编写代码以使测试通过。在这个博客项目中,可能会有各种测试,如集成测试、单元测试和功能测试,确保博客的各个部分按预期工作。 7. 集成第三方库:RoR...

    Desafio-SistemaECommerce:Projecto RoR和JavaScript-平台后端电子商务

    方法all_children在嵌套哈希中生成整个类别列表。 可以在找到 该目录是通过使用Product & ProductVariation模型实现的。 ProductVariation包含有关库存,价格和SKU的所有信息 @ids_available = ProductVariation . ...

    fusion图标使用手册.pdf

    本篇文章将详细讲解如何在ROR中使用FusionCharts,并通过实例解析其核心功能。 首先,我们需要进行FusionCharts的安装。将下载的FusionCharts文件夹中的相关组件放置到指定目录。具体步骤如下: 1. 将`FusionCharts...

    华东师范大学ARM模拟卷+考点解析

    对于准备参加华东师范大学ARM体系结构与汇编课程的模拟考试的学生来说,理解CISC与RISC的区别、熟悉ARM处理器的不同流水线结构、掌握各种指令的使用方法以及了解异常处理机制都是非常重要的。此外,熟练运用寄存器、...

    Todo-App:我构建了一个 Todo 应用程序(几乎是开发教程的“Hello World”)。 我们能够为每个列表创建多个 Todo 列表和多个 Todo 项目,还能够将一个项目标记为完成。 (Ruby on Rails)

    8. **RESTful API**:RoR 鼓励使用 REST(Representational State Transfer)架构风格设计 API,使得客户端(如网页或移动应用)能以标准的方式与服务器进行通信。 9. **测试**:考虑到这是一个教学项目,可能会...

    struts2(checkbox_radio_select)表单标签的应用及详细事例

    本文将详细介绍Struts2中用于处理复选框(checkbox)、单选按钮(radio)以及下拉选择框(select)的表单标签,并通过具体的例子展示它们的用法。 ### 1. 表单标签Checkbox - 复选框 **复选框**允许用户从多个选项...

    程序员二进制计算器 v1.36

    一 用法 在底部框中输入要计算的表达式,会即时显示计算结果,当无结果时说明表达式输入有误。 按回车键保存该次输入、清空输入框,并显示详细结果,包括可能有的错误信息。 在底部框中按键盘上、下箭头,可以...

    rails2.0的配置方法

    ### Rails 2.0 的配置方法 #### 一、引言 Rails 2.0作为Ruby on Rails(简称ROR)框架的一个重要版本,在Web开发领域具有不可忽视的地位。本篇将详细介绍Rails 2.0的配置过程及注意事项,帮助初学者快速上手并深入...

    Cognos+8.3+++JSP前端集成方案

    若报表不需要条件,可以直接使用“默认操作 URL”。 4. **创建 Java Web 项目**: 创建一个新的 Java Web 项目,或者你也可以选择 .NET, PHP, ASP, RoR, Django 等其他 Web 开发框架。这里以 JSP 页面为例,创建一...

    Todo:一个简单的todo存储库,用于学习

    5. **路由**:Rails的路由系统定义了URL到控制器方法的映射,使得用户可以访问不同的功能,例如`/todos/new`创建新待办事项,`/todos/:id/edit`编辑特定ID的待办事项。 6. **视图**:视图是用户看到和与之交互的...

    struts2实战总结

    <s:iterator value="#request.inOutAccountList" id="data" status="listStat"> <s:property value="#listStat.index+1"/> </s:iterator> ``` 这段代码表示遍历`request`域中的`inOutAccountList`集合,并将每个...

    mysql启动时报错:Starting MySQL… ERROR! The server quit without updating PID file

    解决这个问题的方法是使用`chown`命令来改变目录的所有权,如: ``` chown -R mysql.mysql /usr/local/mysql/data ``` 之后,重启mysqld服务。为确保安全,可以考虑将整个MySQL程序目录授权给mysql用户。 2. **...

    推特克隆

    总之,“推特克隆”项目是一个理想的实践平台,它涵盖了RoR的基本概念和Devise的使用,同时提供了实现社交网络功能的实战经验。通过深入研究和修改这个项目,开发者不仅可以提升对Ruby on Rails的理解,还能学习到...

    lottery-backend

    在当今的Web开发领域,Ruby on Rails(RoR)以其简洁的语法、强大的功能以及高效的开发效率,成为了许多开发者青睐的框架。而DataTables则是一款广泛使用的JavaScript库,它能够使HTML表格数据呈现更加交互化、功能...

    jQueryAPI 文档

    10. **性能优化**:理解`$(document).ready()`和`window.onload`的区别,避免全局查找,使用`$(document).on('event', 'selector', function)`替代直接的事件绑定以减少内存占用,以及合理使用`.end()`方法回到之前...

Global site tag (gtag.js) - Google Analytics