类似于 let in Ruby
我曾经写过类似 let 的表达式——具有词法范围。
所以我写了我自己的(悲伤,但它会因多个线程而失败):
# Useful thing for replacing a value of
# variable only for one block of code.
# Maybe such thing already exist, I just not found it.
def with(dict, &block)
old_values = {}
# replace by new
dict.each_pair do |key, value|
key = "@#{key}"
old_values[key] = instance_variable_get key
instance_variable_set key, value
end
block.call
# replace by old
old_values.each_pair do |key, value|
instance_variable_set key, value
end
end
我在谷歌中搜索 ruby 的此类构造(可能是附加块定义),但找不到它。也许我失去了一些东西?在这种情况下,红宝石人使用什么?
PS:抱歉我的英语不好,你知道的。
UPD:我忘了提供用法示例:
@inst_var = 1
with :inst_var => 2 do
puts @inst_var
end
puts @inst_var
输出:
2
1
I used to write let-like expressions -- with lexical scope.
So I write my own (sad, but it will fail with multiple threads):
# Useful thing for replacing a value of
# variable only for one block of code.
# Maybe such thing already exist, I just not found it.
def with(dict, &block)
old_values = {}
# replace by new
dict.each_pair do |key, value|
key = "@#{key}"
old_values[key] = instance_variable_get key
instance_variable_set key, value
end
block.call
# replace by old
old_values.each_pair do |key, value|
instance_variable_set key, value
end
end
I search in google for such constructions (maybe additional block definitions) for ruby, but can't found it. Maybe I loose something? What ruby-people use in such cases?
PS: Sorry for my bad English, you know.
UPD: I foget to provide example of usage:
@inst_var = 1
with :inst_var => 2 do
puts @inst_var
end
puts @inst_var
output:
2
1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一个想法:
单值范围更明确,因为您在块参数中命名变量。这个抽象被称为
as
、pipe
、into
、scope
、let
、peg
,...,凡是你能想到的,都是一样的:An idea:
Single-value scopping is more explicit because you name the variable(s) in the block arguments. This abstraction has been called
as
,pipe
,into
,scope
,let
,peg
, ..., you name it, it's all the same:您无法指定要初始化的值,但可以将变量声明为该块的显式本地变量:
这将导致:
You can't specify the value that you want to initialize, but you can declare a variable as explicitly local to that block:
This will result in: