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

默认参数与闭包的组合

    博客分类:
  • Ruby
阅读更多
还从来没想过或者写过这么麻烦的东西,天啊。
刚才在看去年的RailsConf上Wilson Bilkovich的关于Rubinius的访谈。他提到有些他以为会很容易实现的东西结果异常困难,然后举了个默认参数与lambda组合使用的例子。据说是Ola提出的test case,hmm。

我突然兴奋,暂停了视频播放,打开irb然后玩了一下:
>irb
irb(main):001:0> def foo( x = 5, y = lambda { puts x } )
irb(main):002:1>   y.call
irb(main):003:1> end
=> nil
irb(main):004:0> foo
5
=> nil
irb(main):005:0> i = 2
irb(main):006:0* foo i, lambda { puts i + 1 }
3
=> nil
irb(main):007:0> foo 1
1
=> nil

看上去确实没什么,很直观的语言构造。不过稍微想象这东西要如何实现,一下全身鸡皮都起来了 =_=|| 主要上面的实验里还没把闭包的真正威力用出来。让我们来看看:
>irb
irb(main):001:0> x = 1
=> 1
irb(main):002:0> def foo( x, y = lambda { |x| x *= 5 } )
irb(main):003:1>   x += 1
irb(main):004:1>   y.call x
irb(main):005:1>   x
irb(main):006:1> end
=> nil
irb(main):007:0> foo 1
=> 10
irb(main):008:0> x
=> 1
irb(main):009:0> foo x
=> 10
irb(main):010:0> x
=> 1
irb(main):011:0> foo x, lambda { |x| x *= 5 }
=> 2
irb(main):012:0> x
=> 10

虽然还是很正确很明白的Ruby代码……可是要把这“此x非彼x”关系弄明白真是麻烦。不过在默认参数里放闭包这种事情我还真是没想过。

Wilson提到的问题是他们对局部变量的处理问题吧。大概参数y声明的时候,局部变量还没分配空间之类的问题,然后那个block就不知道捕获哪里的x好。后来似乎是通过修改局部变量的分配方式来解决。

回头我得拿DolphinScript来实验下看看是不是会有奇怪的事情发生才行。
分享到:
评论

相关推荐

    深入理解javascript函数参数与闭包

    深入理解函数参数与闭包是提升JavaScript技能的关键。 1. **函数参数** - **参数是什么**:函数参数是在定义函数时用于接收外部数据的占位符。这些数据可以影响函数执行的结果。例如: ```javascript function ...

    JavaScript 匿名函数和闭包介绍

    闭包是函数和声明该函数的词法环境的组合。换句话说,闭包允许一个函数访问并操作函数外部的变量。创建闭包的常见方式是在一个函数内部创建另一个函数,该函数可以访问外部函数的变量,即使外部函数已经执行完毕。 ...

    详解Java的闭包

    默认方法是另一个与闭包相关的特性,它是 Java 8 中接口的一个增强。默认方法允许接口定义一个带有实现的方法,这样在不破坏已有实现的情况下,可以向接口添加新的功能。例如,`java.util.Comparator` 接口有一个...

    JS闭包可被利用的常见场景小结

    闭包是函数以及声明该函数的词法环境的组合。当函数在其被定义的作用域之外的地方被调用时,它仍能访问定义时的词法作用域,这便是闭包的特性。简单来说,闭包可以理解为是函数内定义的函数,它可以访问到其父函数...

    javaScript闭包技术资料

    2. **活动对象**:在函数执行时创建,用于存储函数参数、局部变量等信息。它是一个内部对象,不可直接通过JavaScript代码访问。 3. **作用域**:定义了变量的作用范围。每个函数都有自己的作用域,通常指在其定义时...

    函数作为参数

    函数作为参数的另一个好处是函数组合。通过将小的、单一职责的函数组合起来,我们可以构建出复杂的逻辑,同时保持代码的简洁性和可读性。这种编程风格被称为函数式编程,它强调无副作用和纯函数,有助于减少错误并...

    JavaScript闭包(closure).pdf

    JavaScript中的闭包是一种高级特性,它是函数和其周围状态(词法作用域)的组合,即使函数在其定义的作用域之外被调用,它仍然能访问到这些状态。这个概念是JavaScript编程中的核心部分,尤其在处理异步操作、模块化...

    函数做参数Pro

    在函数做参数时,闭包是一个关键概念。闭包是一个函数,它“记住”了创建它的环境,即包含了自由变量的引用。这使得函数即使在原始作用域不再存在的情况下,也能访问到那些变量。 4. **回调函数** 回调函数是作为...

    js闭包详解

    闭包是函数及其相关的引用环境组合在一起形成的实体,它使得局部变量在函数执行完毕后依然保持存活状态。这对于那些习惯于C/C++等静态语言的开发者来说可能是一个新的概念。 1. **闭包的概念和特点**: - 闭包是一...

    Rust编程艺术:迭代器与闭包的精妙运用

    ### Rust 编程艺术:迭代器与闭包的精妙运用 #### 一、Rust 语言概述 Rust 是一种高性能的系统级编程语言,它由 Mozilla 研究院发起,Graydon Hoare 设计,并于 2010 年首次发布。Rust 的设计目标在于提供内存安全...

    js闭包是什么?.pdf

    闭包(Closure)是函数和声明该函数的词法环境的组合。简单来说,一个闭包允许一个函数访问并操作函数外部的变量。在JavaScript中,由于函数是一等公民,即函数可以作为参数传递,也可以作为值返回,这为闭包的形成...

    Javascript闭包与函数柯里化浅析

    每当函数作为返回值或者作为其他函数的参数时,就会形成闭包。闭包可以记住并访问定义它的作用域内的变量,即使函数已经执行完毕,这些变量仍然保留。这使得闭包成为存储数据和创建私有变量的有效工具。以下是一个...

    JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】

    函数参数分为形式参数(形参)和实际参数(实参)。 - 形参是在函数定义时声明的变量,用于接收函数调用时传递的实际值。 - 实参是在函数调用时提供的值。 JavaScript函数的参数特性包括: - **参数个数不固定**...

    浅谈Javascript嵌套函数及闭包

    其次,闭包是基于词法作用域和函数对象作为一等公民这两个特性的组合。闭包的存在,意味着函数可以记住并访问其定义时的作用域,即使函数在其定义作用域外被执行。在JavaScript中,当一个函数作为另一个函数的返回值...

    python中闭包Closure函数作为返回值的方法示例

    所以,闭包是由函数和与其相关的引用环境组合而成的实体。 一、函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 >>> def lazy_sum(*args): ... def sum(): ... ax = 0 ... for n...

    js代码-考察点:闭包 两个函数相加

    这两个新函数在执行时会将各自参数与之前传递的值相加。关键在于,内部函数能够访问并记住外部函数的局部变量,这就是闭包特性的一种体现。 例如: ```javascript function addNum(x) { return function(y) { ...

    第九天 04闭包【千锋Python人工智能学院】1

    闭包是函数和其相关引用环境的组合,即使在外部函数执行完毕后,这些引用依然被保留。通过闭包,我们可以创建具有持久状态的函数,这是在动态语言中实现数据封装的一种方式。 在Python中,函数是第一类对象,意味着...

    js函数扩展

    7. **默认参数和剩余参数**:默认参数允许我们在定义函数时为参数提供默认值,而剩余参数(`...rest`)则能捕获未指定位置的剩余参数,方便处理不定数量的输入。 8. **异步函数**:随着Promise和async/await的引入...

    javascript,jquery闭包概念分析

    而`a`和`b`的组合则展示了闭包如何保持对变量`i`的引用,即使在`a`函数执行完毕后,`b`仍然可以访问并修改`i`的值。 在jQuery中,闭包同样被广泛使用。例如,常见的插件编写方式就是一个闭包的例子。像这样的代码:...

Global site tag (gtag.js) - Google Analytics