`
superxielei
  • 浏览: 262682 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Ruby中的迭代器实现。

    博客分类:
  • ROR
阅读更多
记得刚接触ruby的时候被可爱的each深深吸引,也有让人看不懂的
show("Ruby") |value| do puts "value is " + value end

深入了解以后终于发现了其中的秘密,今天有空整理出来。

其实这些都是ruby中的“块”所实现的。
块可以看成是由代码组合成的变量(是不是有点像函数?),我们可以在调用方法的传递一个块做参数,而方法内调用这个块就实现了上边的两种应用。

定义块可以使用
{
  ....
}

或者
do 
  ....
end


然后在方法中使用yield调用就可以啦。

来个小例子,先来看看定义的方法
def show
  yield
end

够简单吧,只有已经yield,有了他我们就可以传递一个块做参数给show方法,show方法就是调用执行我们传递的块。
show do
  puts "我们定义的块" 
end

运行来看看。没有意外屏幕就应该显示  "我们定义的块"
如果看不明白可以这样看看
show (do puts "我们定义的块" end)
#就是个参数,不过参数是个使用块语法定义的块。不过要注意可不能这么写,不能执行的~呵呵!真的想写一行就去掉括号吧。
show do puts "我们定义的块" end

基本的块的应用就是这么简单,来点深的,加上点参数。
还是来看看方法
def show name
  yield name
end

多了一个参数而已,没难度。下面传递块。
show "SuperXieLei" do |value|
  puts "我的名字是:"  + value
end

太简单了。还可以传递多个参数。不写了,和其他的方法差不多。参数不足的时候就是nil,参数多了就是数组。

灵活的使用块可以很方便的让我们编写代码。下边这个是由一本书上改编而来的,书名就不说了避免广告嫌疑。
class Apple
  def initialize name,color,weight,&action
    @name = name
    @color = color
    @weight = weight
    @action = action
  end

  def show
    @action ? ( @action.call :name,@name) : (yield :name,@name)
    @action ? ( @action.call :color,@color) : (yield :color,@color)
    @action ? ( @action.call :weight,@weight) : (yield :weight,@weight)
  end
end

apple = Apple.new "红苹果","红色","0.4" do |name,value|
  puts "使用原始块执行--" + name.to_s + "变量值是:" + value.to_s
end
apple.show do |name,value| 
  puts "使用新定义块执行--" + name.to_s + "变量值是:" + value.to_s
end

apple1 = Apple.new "绿苹果","绿色","0.8"
apple1.show do |name,value| 
  puts "使用新定义块执行--" + name.to_s + "变量值是:" + value.to_s
end
分享到:
评论

相关推荐

    js 数组实现一个类似ruby的迭代器

    ·基本实现 ·在迭代中引用原来的对象,或者直接改变数组的值而不是返回一个新数组 ·向迭代传入无限多的参数 ·基本实现 今天突然发现js的数组处理起来真是麻烦,代码一些就是一大堆,相比起ruby的迭代器来真是逊色...

    Ruby迭代器的7种技巧分享

    二、依次打印1..9,在ruby中的方法就更多了,这里用比较简单的方式来实现,如下: 代码如下: (1..9).each{|i| print i,” “} 三、打印1..9中比7要小的数值,如下: 代码如下: 1.upto(9){|i| print i,” ” if i &...

    Ruby中Block和迭代器的使用讲解

    可以用Block实现回调(但它比Java的匿名内部(anonymous inner)类更简单),传递一组代码(但它远比c的函数指针灵活),以及实现迭代器。 Block只是在花括号或者do…end之间的一组代码。 {puts Hello} #this is a ...

    python 使用cycle构造无限循环迭代器

    源码里我们可以看到它实现了__iter__和__next__的魔术方法,说明它既是可迭代对象也是一个迭代器,我们可以使用for循环和next()方法去操作它 我们先来看看以普通的方式去遍历一个列表 li = ['python', 'java', 'c',...

    rgl:RGL是用于Ruby中图形数据结构和算法的框架

    Ruby图形库(RGL) RGL是用于图形数据结构和算法的框架。... 在Ruby中,可以使用其他技术来主要使用mixin和迭代器来表达算法和数据结构的通用特征。 BGL文档提到了三种实现通用性的方法: 算法/数据结

    well-grounded-rubyist-book-notes:我在Jupyter Lab(Ruby内核2.7.0)中实现的“ The Well-Grounded Rubyist”(Black&Leo)的工作笔记。

    类和方法查找method_missing 类和模块设计/命名介绍范围方法访问规则顶级方法有条件的执行循环迭代器和代码块错误处理与异常文字构造函数句法糖爆炸方法和危险转换方式布尔状态和对象...和零比较两个对象检查对象...

    square_array-ruby-apply-000

    使用迭代器并实现自己的逻辑,不要使用.each以外的任何内置数组方法(例如.collect , .inject )。 您可以问自己几个问题: 在数组上调用.each的返回值是多少? 如何在数组的每个元素上进行操作,还如何收集或存储...

    Viewpoint:用于Microsoft Exchange Web服务(EWS)的Ruby客户端访问库

    这些方法中的每一个都有重大问题,因此最后我决定最简单的方法是使用Nokogiri构建SOAP消息,因为我已经将其用作响应消息的解析器。 视点不再建立在Singleton模式上。 以前的原因是因为Handsoap后端。 H

    square_array-v-000

    使用迭代器并实现自己的逻辑,不要使用.each以外的任何内置数组方法(例如.collect , .inject )。 您可以问自己几个问题: 在数组上调用.each的返回值是多少? 如何在数组的每个元素上进行操作,还如何收集或...

    square_array-001-prework-web

    使用迭代器并实现自己的逻辑,不要使用.each以外的任何内置数组方法(例如.collect , .inject )。 您可以问自己几个问题: 在数组上调用.each的返回值是什么? 如何在数组的每个元素上进行操作,还如何收集或...

    square_array-online-web-prework

    使用迭代器并实现自己的逻辑,不要使用.each以外的任何内置数组方法(例如.collect , .inject )。 您可以问自己几个问题: 在数组上调用.each的返回值是什么? 如何在数组的每个元素上进行操作,还如何收集或存储...

    square_array-online-web-sp-000

    使用迭代器并实现自己的逻辑,不要使用.each以外的任何内置数组方法(例如.collect , .inject )。 您可以问自己几个问题: 在数组上调用.each的返回值是什么? 如何在数组的每个元素上进行操作,还如何收集或存储...

    learntoprogram:我在 Chris Pine 的《学习编程》第二版中工作时的代码片段

    rand 函数模块介绍第07章-流量控制分支、循环和逻辑第08章数组和迭代器数组、数组方法和迭代简介第09章 - 编写你自己的方法定义方法方法参数变量范围返回值第 10 章 - 递归递归简介创建排序算法重新实现排序不区分大...

    Programming-univbasics-4-square-array-online-web-prework

    申请while遍历数组要构建此方法,请在while使用迭代器并实现自己的逻辑。 仅使用while , Array和该解决方案的任何其他先前讨论的方法。 不要使用Ruby文档或互联网来查找您可能还不了解的内置方法或代码。 例子: ...

    java笔试题算法-sieve:用各种语言实现Eratosthenes筛以展示GraalVM和Truffle的强大功能

    以各种语言实现 Eratosthenes 筛以展示 GraalVM 和 Truffle 的强大功能。 请先下载后再进行实验。 已经过测试可以与版本19.3.1 。 Ruby速度 使用以下命令可以发现 GraalVM Ruby 比其他任何命令都快十倍。 该程序使用...

    awesome-roblox:用于 Roblox 游戏开发的精选库、插件和资源列表

    (待办事项:目录)脚本- 通过 Google Analytics 跟踪访问和 Lua 错误 - 资源管理器和属性窗口的 GUI 实现- 当零件被爆炸击中时将它们分成碎片库和框架 - 一个类似 Ruby 的实用程序库,用于处理迭代器、表、数组和...

    go-libgit2:libgit2 的惯用 Go 绑定

    通过通道或切片步行提交Walker类型提供了一个C提交通道和Slice()函数来覆盖提交,而不是类似 C 的迭代器类型。可通过go get安装只要您安装了最新版本的libgit2 。不需要runtime.LockOSThread / runtime....

    mac_address_eui48:代表MAC地址的类的实现(IEEE EUI48标识符)

    Mac地址Eui48 这是MAC地址的实现,以及用于OUI查找和随机MAC地址生成的工具。 它可以用作Ruby库或通过命令行工具使用。 OUI解析器基于IEEE 提供的官方OUI文件。 该文件存储在data/ 。特征命令行工具gen_mac_address....

    inject-rewrite:创客学院

    ##第 2 周结束挑战(第一部分):注入-重写这个 repo 构成了周末挑战的一半,... 它的工作原理是初始化一个“累加器”对象,该对象遍历对象中的每个元素并在每次迭代时执行计算(重置累加器以在下一个元素上使用)。

Global site tag (gtag.js) - Google Analytics