`
cookoo
  • 浏览: 644374 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

Ruby yield释疑

    博客分类:
  • Ruby
阅读更多
context switch不足以表明coroutine,一般的方法调用(subroutine)也是context switch的,只有能保留上次context的(continuation)才是coroutine。Ruby的yield只是种匿名函数调用的syntax sugar。布娃娃用的yield 1, yield2, yield3的例子是用1,2,3去初始化块变量, block本身不记得上次的context:
>> def test2                 
>>   yield                   
>>   yield                   
>>   yield                   
>> end                     
=> nil                       
>> test2{x ||= 0; puts x+= 1}
1                            
1                            
1                            
=> nil


对比一下python的yield:
def fib():
  x, y = 0, 1
  while 1:
    x, y = y, x+y
    yield x

g = fib()
for i in range(9):
  print g.next(),  

显然python的generator是lazy的,不是简单的调用/返回。
ruby要完成同样的lazy效果的话,得借助于callcc实现的coroutine,光靠yield是办不到的。
分享到:
评论

相关推荐

    Ruby元编程第二版中文

    6. **块与yield**:Ruby的块是代码的匿名片段,可以用`yield`来调用。它们是元编程中常见的一部分,尤其是在迭代器和回调函数中。 7. **Ruby的鸭子类型**:Ruby强调“鸭子若能走路并嘎嘎叫,那它就是鸭子”,这意味...

    Ruby资源ruby-v3.1.1.zip

    例如,`yield [a, b], {c: d}`可以直接将数组和哈希解构为单独的变量。 2. **Symbol to_proc的优化**:Ruby 3.1对`Symbol#to_proc`进行了优化,提高了使用方法引用作为块时的性能。这在处理集合时特别有用,如`...

    Pb中Yield()函数的使用[文].pdf

    Pb 中 Yield() 函数的使用 Yield() 函数是 PowerBuilder 中一个非常有用的函数,它可以将控制权转移给其他图形对象,包括非 PowerBuilder 对象。该函数检测消息队列,如果有消息,就把消息取出。该函数返回布尔型值...

    Ruby-Ruby的面向对象的枚举

    values.each { |value| yield value } end private_class_method :new end DaysOfWeek.each do |day| puts day end ``` 在这里,`values` 是Ruby类的实例方法,返回类的所有常量。通过`each` 方法,我们可以...

    yield表达式.pdf

    Python中的yield表达式是一个极为重要的概念,它是生成器(generator)的核心组成部分。生成器在处理大量数据时显得尤为有用,因为它可以逐个产生数据项而不是一次性加载所有数据到内存中。这不仅可以节省内存,还能...

    使用C# yield关键字来提高性能和可读性

    使用C# yield关键字来提高性能和可读性 C# 中的 yield 关键字可以提高代码的性能和可读性。yield 关键字可以让开发者使用惰性枚举(Lazy Enumeration),从而减少不必要的内存分配和数据处理。下面我们将详细介绍 ...

    java 线程让步(Yield)

    Java线程让步(Yield)是Java多线程编程中的一个重要概念,它涉及到线程调度和并发控制。在多线程环境下,线程让步意味着一个正在运行的线程主动放弃当前的时间片,以便其他就绪状态的线程有机会执行。这与线程的...

    07Ruby 块.docx

    ### Ruby 块详解 #### 一、Ruby简介与特性 Ruby是一种动态、面向对象的高级编程语言。它以其简洁而优雅的语法著称,并因此被誉为“程序员最好的朋友”。Ruby的强大之处不仅在于其灵活的语法结构,还在于其强大的元...

    Ruby 基础

    Ruby支持块(block),这是匿名函数的一种形式,通常与`yield`关键字一起使用。块可以用`do..end`或`{..}`定义,并且可以接受参数。 面向对象编程是Ruby的核心。Ruby中的每个对象都是一个类的实例,每个类都继承自`...

    ruby-2.0.0-p0.tar

    5. **统一的块调用语法**:在Ruby 2.0中,`yield`和`call`有了统一的调用语法,使得块的调用更加一致和简洁。 6. **元编程增强**:Ruby本就以其强大的元编程能力著称,2.0版本进一步强化了这一点,比如`Class.new`...

    ruby初学者教程(对初学者很有帮助)

    ### Ruby语言介绍与基础知识 #### 一、Ruby语言概述 **1.1 Ruby的历史** Ruby是一种面向对象的脚本语言,由日本人松本行弘(Matsumoto Yukihiro)于1993年开始开发。起初,Ruby是作为一种兴趣项目而诞生的,但...

    详解Ruby当中的算数运算

    它可以用来检测变量、方法、`super`调用或`yield`是否存在。例如,`defined? foo`会返回"local-variable"如果foo已被初始化,否则返回`nil`。 最后,双冒号`::`运算符允许我们直接调用模块或类的方法,或者引用模块...

    10.28 yield正则表达式替换字符串

    在本主题"10.28 yield正则表达式替换字符串"中,我们将深入探讨如何使用正则表达式来替换字符串,并结合Ruby编程语言中的yield关键字进行相关操作。 首先,正则表达式允许我们用一种简洁的方式来定义字符串的模式。...

    ruby使用文档

    - 方法可以通过`yield`调用块,实现类似闭包的功能。 4. **类与模块**: - 类是面向对象的基础,使用`class`定义,`end`结束,通过`new`创建对象。 - 模块用于代码组织和命名空间隔离,可以使用`include`、`...

    ruby-2.6.5.tar.gz

    - **语法改进**:Ruby 2.6引入了一些新的语法特性,比如`yield`关键字的简化,以及`Symbol#to_proc`的优化,使代码更易读写。 - **Ruby编译器改进**:Ruby 2.6改进了编译时错误的报告,使调试过程更加友好。 总之...

    yield总结与实例

    二、yield是一个语法糖,为方便开发者提供的一种方便方法 三、yield返回类型为IEnumerator、IEnumerable、IEnumerator、IEnumerable 四、如果返回类型为IEnumerator编译时会实现一个实现了IEnumerator接口的类 五、...

    ruby下载太慢保存下

    3. **语法改进**:引入了新的语法特性,如Pattern Matching(模式匹配)的实验性支持,以及对`yield`关键字的增强。 4. **库更新**:内部库如`Matrix`和`Complex`进行了更新,提供了更多的功能和改进。 了解并熟练...

    ruby的API文档,有需要同事请下载

    - 代码块和块参数:通过`do..end`或`{..}`定义代码块,`yield`关键字调用代码块。 6. **异常处理** - `begin..rescue..else..ensure`用于捕获和处理程序运行时的错误。 7. **Gem生态系统** - Ruby社区拥有丰富...

Global site tag (gtag.js) - Google Analytics