比如让Ruby进来
我曾经写过let-like表达式——具有词法范围 所以我写了我自己的(很遗憾,但它会在多个线程中失败): 我在google中搜索ruby的这种构造(可能是额外的块定义),但没有找到。也许我弄丢了什么?在这种情况下,人们使用什么ruby 你知道,对不起,我的英语不好 UPD:I foget提供使用示例:比如让Ruby进来,ruby,lexical-scope,Ruby,Lexical Scope,我曾经写过let-like表达式——具有词法范围 所以我写了我自己的(很遗憾,但它会在多个线程中失败): 我在google中搜索ruby的这种构造(可能是额外的块定义),但没有找到。也许我弄丢了什么?在这种情况下,人们使用什么ruby 你知道,对不起,我的英语不好 UPD:I foget提供使用示例: @inst_var = 1 with :inst_var => 2 do puts @inst_var end puts @inst_var 输出: 2 1 不能指定要初始化的值,但
@inst_var = 1
with :inst_var => 2 do
puts @inst_var
end
puts @inst_var
输出:
2
1
不能指定要初始化的值,但可以将变量声明为该块的显式局部变量:
x = 'external value'
puts x
[1,2,3].each do |i; x|
x = i
puts x
end
puts x
这将导致:
external value
1
2
3
external value
一个想法:
class Object
def let(namespace, &block)
namespace_struct = Struct.new(*namespace.keys).new(*namespace.values)
namespace_struct.instance_eval(&block)
end
end
message = let(language: "Lisp", year: "1958", creator: "John McCarthy") do
"#{language} was created by #{creator} in #{year}"
end
单值范围映射更显式,因为可以在块参数中命名变量。这个抽象被称为,管道
,进入
,范围
,让
,peg
,…,你可以说,都是一样的:
class Object
def as
yield self
end
end
sum = ["1", "2"].map(&:to_i).as { |x, y| x + y } #=> 3
什么是let-like表达式?@Andrew:let表达式在许多语言中都有使用(LISP、Haskell、ML等)。值得注意的是,在本例中,i
也是本地块。两个很好的建议都提供了一种干净的方式来扩展语言以满足您的需要。
class Object
def as
yield self
end
end
sum = ["1", "2"].map(&:to_i).as { |x, y| x + y } #=> 3