Ruby作用域,从函数返回Proc
Ruby scope, returning a Proc from a function
来自JavaScript背景,我已经习惯了使用JavaScript的动态范围将值封装在函数中。例如:
function Dog( firstname, lastname ) {
this.fullname = firstname + lastname
return {
say_name: function () {
return fullname;
}
}
}
现在在Ruby中,我不太确定这样的东西会不会工作得太好:
class Foo
attr_accessor :bar, :baz
def initialize bar, baz
@bar = bar
@baz = baz
end
def give_me_a_proc
return Proc.new { @bar + @baz }
end
end
有人能快速解释一下Ruby中scope是如何工作的吗?如果我调用从give_me_a_proc
返回的Proc,它还会访问其定义的时间范围吗?
此外,一旦我定义了proc,这些值是否会变为固定值,或者在Foo
中所做的任何更改是否会在定义后结转到proc?
是的,它仍然可以访问定义时间范围。请参阅Proc类的文档。
更改将转入Proc post定义。irb的结果与你的班级一起运行。
> foo = Foo.new(1, 2)
=> #<Foo:0x007f9002167080 @bar=1, @baz=2>
> quux = foo.give_me_a_proc
=> #<Proc:0x007f900214f688@(irb):11>
> quux.call
=> 3
> foo.bar = 3
=> 3
> quux.call
=> 5
Ruby procs和lambdas是闭包。当您执行return Proc.new { @bar + @baz }
时,您实际上是在捕获self
,这就是查找实例变量的方式。Ruby块也是闭包。Ruby确实允许您更改变量,并且这些更改将传播到调用范围,假设调用范围仍然存在:
@hi = 0
def get_hi()
lambda {@hi = 42}
end
get_hi.call()
@hi #=> 42
注意:除非您的proc有非常宽松的参数要求(它不在乎是否有任何参数,有多少,有点像C的int f(void)
),否则使用lambda
而不是Proc.new
。lambda
检查以确保获得正确数量的参数。
Ruby有一个从对象获取闭包的方法,它非常适合您的示例:
class Foo
# reopen Foo class
def get_sum
@bar + @baz
end
end
m = Foo.new(5,20).method(:get_sum)
m.call #=> 25
m
是Method
对象,它在Foo
的实例中充当闭包,因此实例变量和self
的值仍然可用。
相关文章:
- 节点导出返回一个空对象
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 控制台返回var不是't定义,但它是
- 从函数返回角度承诺
- Javascript返回值只在循环中返回一次
- 从控制器返回后Ajax启动事件激发
- CKFinder 3为所选文件返回错误的URL
- 如何在d3.js中返回路径的y坐标
- 如何从jquery函数返回变量
- Angular js-返回一个包含类似
- JSONP请求返回结果,但也触发error_callback
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- JS验证ajax返回的html中的表单数据
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- AJAX:$_GET不返回任何值
- 从Javascript方法返回全局变量
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- Ruby作用域,从函数返回Proc