【Ruby on Rails全栈课程】2.7 块(Block)和迭代器

简介: 1、块(Block)块是ruby 的一个独特特性,是一种可以和方法调用相关联的代码块。是在花括号{}或者do…end之间的一组代码,一般我们在单行中block用花括号{},在多行中用do…end(1)块的格式

1、块(Block)


块是ruby 的一个独特特性,是一种可以和方法调用相关联的代码块。

是在花括号{}或者do…end之间的一组代码,一般我们在单行中block用花括号{},在多行中用do…end


(1)块的格式


对象.方法名(参数列表)|块变量| 
块代码 
end


对象.方法名(参数列表){|块变量| 块代码 }


(2)块的用法


块(block)与方法关联之后,在关联的方法中用yield语句,调用相关联的block


#定义一个名为block_test的方法
irb(main):001:0> def block_test
#yield代表块里面的内容
irb(main):002:1> yield
irb(main):003:1> yield
irb(main):004:1> yield
irb(main):005:1> end
=> :block_test
#block_test方法后面跟着块{ puts "Hi" },将块关联到了方法上,方法中每个yield语句都会调用一次块
irb(main):006:0> block_test { puts "Hi" }
Hi
Hi
Hi


在实际的项目中,块通常与迭代器结合使用,这样会使代码很简练,下面我们来介绍一下迭代器以及与块的结合使用。


2、迭代器(Enumerator)


迭代器具有遍历容器型数据结构(数组、哈希等)的能力,每一种容器型数据结构(数组、哈希等)都有自己的迭代器。通过块可以很简单的操作迭代器


(1)each,连续访问集合的所有元素,通常在遍历数据时使用


#数组后面跟着each,就是一个迭代器对象,下面返回了数组的each迭代器对象
irb(main):007:0> [1,2,3,4,5].each
=> #<Enumerator: [1, 2, 3, 4, 5]:each>
#在块中(即大括号{}中的代码),两条竖线|i|之间的i代表遍历数组返回的每个数组元素
#puts i将数据每个元素按照顺序打印出来
irb(main):008:0> [1,2,3,4,5].each {|i| puts i }
1
2
3
4
5


(2)map、collect,从集合中获得各个元素传递给块(block),块中代码返回的结果生成新的集合。如果需要将集合中的每个元素做操作返回到一个新数组中,通常使用map。比如将集合中的元素统一换成大写、统一将字符串转换成数组。

map和collect相同的用法。


#将数组的元素统一换成大写
irb(main):023:0> ["a","b","c"].map{|i| i.upcase}
=> ["A", "B", "C"]
#统一将数组中的元素由字符串转换成数组。
irb(main):002:0> ["101","102","103"].map{|x| x.to_i}
=> [101, 102, 103]
#这种写法等同于上面的写法,项目中我们一般都是这样写。需要注意的是,这里用的是小括号()而不是大括号{}
irb(main):003:0> ["101","102","103"].map(&:to_i)
=> [101, 102, 103]


(3)select,从集合中获得各个元素传递给块(block),返回数组中所有满足block条件的值,生成新的集合。


irb(main):014:0> [1,2,3,4,5].select{|i| i>3}
=> [4, 5]


(4)reject,从集合中获得各个元素传递给块(block),返回数组中所有不满足block条件的值,生成新的集合。


irb(main):099:0> [1,2,3,4,5].reject{|i| i>3}
=> [1, 2, 3]


(5)inject,遍历整个集合中的各个元素,将各个元素,按照一定的方式累积,最后返回一个新的元素。


#inject后面跟的块有两个参数,第一次遍历时,第一个参数是数组第一个值,第二个参数是数组第二个值
#之后遍历,块中代码计算的值传给sum,而per是数组中元素的遍历
irb(main):016:0> [1,2,3,4,5].inject {|sum,per| sum+per}
=> 15
#让我们更加直观的看一下
irb(main):015:0> [1,2,3,4,5].inject {|sum,per| puts "sum:#{sum},per:#{per}";sum+per}
sum:1,per:2
sum:3,per:3
sum:6,per:4
sum:10,per:5
=> 15
#当inject后面指定了参数,第一个sum就是指定的这个参数  ,而per也是数组的第一个值
irb(main):017:0> [1,2,3,4,5].inject(7) {|sum,per| puts "sum:#{sum},per:#{per}";sum+per}
sum:7,per:1
sum:8,per:2
sum:10,per:3
sum:13,per:4
sum:17,per:5
=> 22
目录
相关文章
|
4月前
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
4月前
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
59 0
|
4月前
|
前端开发 API C++
在Ruby世界中寻找你的Web框架灵魂伴侣:Rails vs Sinatra
【8月更文挑战第31天】在Ruby的世界里,选择Web框架如同挑选衣物,需根据场合和需求。Rails与Sinatra是两大热门框架,前者以其“约定优于配置”理念和全面的功能成为企业级应用的首选;后者则以轻量级和灵活性著称,适用于快速原型开发和小规模应用。通过对比两者特性,如Rails的MVC架构与Sinatra的简洁API,我们可以看到它们各有所长。选择合适的框架,如同找到旅途中的最佳伙伴,让开发之路更加顺畅愉悦。这场探索之旅教会我们,没有绝对的好坏,只有最适合的选择。
47 0
|
4月前
|
安全 前端开发 数据安全/隐私保护
如何在Ruby on Rails中打造坚不可摧的OAuth认证机制
【8月更文挑战第31天】在构建现代Web应用时,认证与授权至关重要。本文介绍如何在Ruby on Rails中实现OAuth认证,通过使用`omniauth`和`devise` gems简化流程。首先安装并配置相关gem,接着在`User`模型中处理OAuth回调,最后设置路由及控制器完成登录流程。借助OAuth,用户可使用第三方服务安全地进行身份验证,提升应用安全性与用户体验。随着OAuth标准的演进,这一机制将在Rails项目中得到更广泛应用。
62 0
|
5月前
|
SQL 安全 数据库
Ruby on Rails 数据库迁移操作深度解析
【7月更文挑战第19天】Rails 的数据库迁移功能是一个强大的工具,它帮助开发者以版本控制的方式管理数据库结构的变更。通过遵循最佳实践,并合理利用 Rails 提供的迁移命令和方法,我们可以更加高效、安全地管理数据库结构,确保应用的稳定性和可扩展性。
|
6月前
|
前端开发 测试技术 数据库
Ruby on Rails:快速开发Web应用的秘密
【6月更文挑战第9天】Ruby on Rails,一款基于Ruby的Web开发框架,以其高效、简洁和强大备受青睐。通过“约定优于配置”减少配置工作,内置丰富功能库加速开发,如路由、数据库访问。活跃的社区和海量资源提供支持,MVC架构与RESTful设计确保代码清晰可扩展。高效的数据库迁移和测试工具保证质量。Rails是快速构建Web应用的理想选择,未来将持续影响Web开发领域。
|
7月前
|
开发框架 安全 前端开发
使用Ruby on Rails进行快速Web开发
【5月更文挑战第27天】Ruby on Rails是一款基于Ruby的高效Web开发框架,以其快速开发、简洁优雅和强大的社区支持著称。遵循“约定优于配置”,Rails简化了开发流程,通过MVC架构保持代码清晰。安装Ruby和Rails后,可使用命令行工具创建项目、定义模型、控制器和视图,配置路由,并运行测试。借助Gem扩展功能,优化性能和确保安全性,Rails是快速构建高质量Web应用的理想选择。
|
7月前
|
监控 数据可视化 前端开发
使用Ruby on Rails构建的员工上网行为监控Web应用
我们开发了一款基于Ruby on Rails的员工上网行为监控Web应用,帮助企业保护数据安全和确保员工生产力。该应用利用Rails的MVC架构和Active Record管理数据库,通过网络代理和JavaScript追踪员工网络活动。数据收集后,应用进行分析和可视化,以便识别异常行为。此外,借助Rails的后台任务和Sidekiq gem,实现数据自动化处理和定时更新,为公司提供实时监控反馈。
325 2
|
7月前
|
缓存 前端开发 测试技术
框架分析(6)-Ruby on Rails
框架分析(6)-Ruby on Rails
|
7月前
|
存储 Ruby